[pgsql-jp: 41673] Re: DBLINK使用時に Out of Memory エラー
MauMau
maumau307 @ gmail.com
2014年 6月 2日 (月) 23:54:57 JST
MauMauです。
> 花田です。
>
> 「dblink temporary context:」が16万行程度でているということなので、おそ
> らくこられのメモリ使用量の合計が一番の原因だと思います。一つのDELETE文を
> 実行するのに16万回程度dblink('con', 'SELECT...')が実行されているようなの
> ですが、DELETE文の実行計画(ANALYZEオプションなし)をとることは可能ですか?
おそらく、9.2での次の性能改善に起因するメモリリークだと思います。
残念ながら、パラメータなど外部からの制御で問題を回避することはできなさそうです。
Improve efficiency of dblink by using libpq's new single-row processing mode
(Kyotaro Horiguchi, Marko Kreen)
dblinkでSQL文を実行する際、
dblink temporary contextというメモリコンテキストを作成します。
本来なら、contrib/dblink/dblink.cのstoreQuery()の最後で、
このメモリコンテキストを削除するのが正しいのでしょう。
これにより、dblinkの関数から復帰するときには、このメモリコンテキストがなくなります。
今の実装だとおそらく、dblinkを呼び出すSQL文、今回だとDELETE文の終了時に、
削除し忘れたメモリコンテキストが自動的に削除されると推測します。
今回は1つのDELETE文で16万回dblink関数が呼ばれており、
それぞれの呼び出しが8KBのメモリをリークするため、1GB超のメモリが残ってしまったものと思います。
有識者の方、正しいか確認いただけると幸いです。
よければ、コミュニティに修正パッチを送ってみます。
以上です。
pgsql-jp メーリングリストの案内