[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 メーリングリストの案内