[pgsql-jp: 41205] INSERT INTO XXX SELECTでout of memoryが発生
y hori
yuji.hori @ gmail.com
2012年 9月 3日 (月) 08:27:43 JST
お世話になります。horiと申します。
掲題の件で質問なのですが、
下記の様なSQLを実行するプロシージャで、out of memoryが発生しており、
原因が分からず悩んでいます。
エラー時のクエリは下記のエラーです。
INSERT INTO テーブルA
SELECT
*
FROM テーブルB AS B
WHERE
NOT EXISTS
( SELECT * FROM テーブルA AS A
WHERE
A.pkey1 = B.pkey1
AND A.pkey2 = B.pkey2
)
AND B.pkey2 > 1234::bigint
AND B.pkey2 <= 5678::bigint
;
環境:
PostgreSQL 8.3.14 (Windows版)
物理メモリ:4GB
postgressql.confの設定値
shared_buffers = 512MB
work_mem = 16MB
maintenance_work_mem = 24MB
行いたい処理:
同じ構造のテーブルが2つあり、テーブルBのデータをテーブルAに重複を省いて格納しようとしています。
(テーブルBのデータをAに入れたいが、テーブルAにあるものは入れないようにする。)
テーブルA : 約2000万件 (5.6GB程)
テーブルB : 約200万件 (569MB程)
上記テーブルAにはPrimary key (pkey1,pkey2)がついています。
テーブルBは一時的なものなので主キーはつけていませんが、
テーブルA同様、データもpkey1,pkey2で一意です。
(LEFT JOINでpkey IS NULLとして重複排除するSQLでも同じくout of memoryが発生しました。)
エラー内容と症状:
ERROR: out of memory
DETAIL: Failed on request of size 20.
というエラーが発生。
サブクエリーのEXISTS以下のSELECTだけだと発生せず、
INSERT INTO SELECTを行おうとすると発生します。
SELECTだけだとワーキングセットは300MB弱になりました。
out of memoryはプロシージャ実行後に
postgres.exeの1プロセスのワーキングセットが2GB付近になると発生しています。
(32bit OSなので2GBの上限だと考えています。)
不明点:
なぜこのようなout of memoryが発生するのか分からなくて悩んでいます。
(INSERT INTO はこの場合使えない?)
本件について原因と、可能であれば回避方法について、
お力を貸していただければ幸いです。
以上です。宜しくお願い致します。
pgsql-jp メーリングリストの案内