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