[pgsql-jp: 41207] Re: INSERT INTO XXX SELECTでout of memoryが発生

花田 茂 hanada @ metrosystems.co.jp
2012年 9月 3日 (月) 09:51:44 JST


花田です。

(2012/09/03 8:27), y hori wrote:
> テーブルA : 約2000万件 (5.6GB程)
> テーブルB : 約200万件  (569MB程)
> 
> 上記テーブルAにはPrimary key (pkey1,pkey2)がついています。
> テーブルBは一時的なものなので主キーはつけていませんが、
> テーブルA同様、データもpkey1,pkey2で一意です。

INSERT 先のテーブルですが、AFTER INSERT トリガーや参照整合性制約はついて
いないでしょうか?これらがあると、INSERT した行数分だけトリガイベントを
保存していくので、バックエンドのメモリ使用量が増えてしまうようです。

8.3 環境が手元になく 9.1.2 環境での追試しかできませんでしたが、FK がある
場合だけバックエンドプロセスのサイズが増える現象が再現できました。

回避策は「トリガーや制約を外した状態で INSERT する」です。カーソルを使っ
て一行ずつ INSERT することでも回避できるかも知れません(とても遅くなるか
もしれませんが)。

-- 
株式会社メトロシステムズ
  花田 茂
Mail : hanada @ metrosystems.co.jp
 Tel : 03-5951-1219
 Fax : 03-5951-2929


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