[pgsql-jp: 38100] Re: コミット待ちトランザクションのメモリ消費量について

Tatsuo Ishii ishii @ sraoss.co.jp
2007年 2月 27日 (火) 22:20:30 JST


石井です.

> 海老原です。
> 
> >  ただし、データを投入するSQL内で文字列演算を多用するなど、PostgreSQL内
> > 部のワークメモリを多く必要とする処理の場合には注意が必要です。これらの
> > ワークメモリの中には、演算の終了時ではなくてトランザクションの終了時にの
> > み開放されるものがあり、これが未コミットデータの件数分積み重なって、コ
> > ミット前にメモリを使い切る可能性があります。
> 
> 私はまさにここが気になっていました。
> 共有メモリはそもそも固定サイズなので、問題はバックエンドプロセスの
> プライベートなメモリ領域だということですよね。

そうですね.

> 実際、数千万件を一括更新するUPDATE文を実行したときに、以下のようなエ
> ラーが発生してバックエンドが異常終了する例は7.1で見たことがあります。
> 
> ERROR: Memory exhausted in AllocSetAlloc(108)
> 
> バックエンドのプロセスサイズは概ね2GBでした。

昔のバージョンは結構無駄にメモリをため込んでいるところがあり,このよう
な現象も起きたものです.

最近のバージョンではメモリコンテキストを細かく分けて,なるべくメモリの
解放を行うようになっています.単純に1億件位のデータをコピー(当然ながら
1トランザクションになります)する位では,メモリを食いつぶすようなことは
ありません.

が,中にはできの悪い関数もあったりするので,試してみるのが一番だと思い
ます.
--
Tatsuo Ishii
SRA OSS, Inc. Japan



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