[pgsql-jp: 35619] Re: ANALYZE で oid が変化してしまう

Kazawa Tsunehisa digitune @ gmail.com
2005年 6月 29日 (水) 17:32:49 JST


加澤です。ちょっと分かってきました。

05/06/29 に Kazawa Tsunehisa<digitune @ gmail.com> さんは書きました:
> 加澤です。石井さん、いつも貴重なご助言ありがとうございます。
> 
> 05/06/29 に Tatsuo Ishii<t-ishii @ sra.co.jp> さんは書きました:
> > 石井です.
> >
> > psqlで接続した後,別端末からpsコマンドでpostgresプロセスのpidを調べ,
> > gdbでpostgresにアタッチしてnewoidにブレークポイントを貼って,ANALYZEを
> > 実行し,止ったところでgdbのbtコマンドでバックトレースを取れば,どうい
> > う条件でnewoidが呼ばれるか簡単にわかると思います.
> 
> 現象が発生するマシンは管理セクションが異なるためいろいろ大変だったのです
> が (そんな内部事情はどうでも良い>俺)、何とか backtrace を取ることが出来ま
> した。下記に添付します。
> 
> Breakpoint 1, 0x0809e164 in newoid ()
> (gdb) bt
> #0  0x0809e164 in newoid ()
> #1  0x08080770 in toast_compress_datum ()
> #2  0x08081e01 in heap_tuple_toast_attrs ()
> #3  0x0807e0ee in heap_update ()
> #4  0x0807e1a8 in simple_heap_update ()
> #5  0x080d6a06 in analyze_rel ()
> #6  0x0810378d in vacuum ()
> #7  0x081769f0 in PortalSetResultFormat ()
> #8  0x08176d83 in PortalRun ()
> #9  0x081732c9 in pg_parse_query ()
> #10 0x08174b7b in PostgresMain ()
> #11 0x08150505 in ClosePostmasterPorts ()
> #12 0x08152619 in PostmasterMain ()
> #13 0x081246cc in main ()
> 
> これは他のマシンでは起きない「ANALYZE pg_largeobject」を実行した際に、
> newoid にセットした breakpoint にて停止した際の backtrace です。
> 
> 早速 7.4.7 のソースに当たってみたんですが、toast_compress_datum の中
> に newoid が見あたらない?

heap_tuple_toast_attrs 内で呼ばれている toast_insert_or_update が static
な function なために、その側にある static でない toast_compress_datum が
見えちゃってるだけみたいですね。実際には、

heap_tuple_toast_attrs
toast_insert_or_update
toast_save_datum

の順で呼ばれ、最後の関数内で newoid がコールされているようです。

これが何を意味し、なぜ ANALYZE するたびに newoid されてしまうのか、は
さらにこれから考えてみます…。

-- 
Tsunehisa KAZAWA
http://www.digitune.org



pgsql-jp メーリングリストの案内