[pgsql-jp: 40498] Re: 大容量のテーブルに対してSQLを発行するとエラーになる件について

Hiroshi Inoue inoue @ tpf.co.jp
2010年 11月 4日 (木) 18:19:39 JST


井上です。

(2010/11/04 17:38), toshihideka4316 @ zenrin.co.jp wrote:
> お世話になります、片山です。
> 
> PostgreSQL8.2.14(サーバ、クライアント共に)+ODBC(ドライバver8.2.4)を使用して
> おります。
> (接続文字列は以下の通りです)
> DSN=PostgreSQL35W;DATABASE=MIDO;SERVER=MIDO;PORT=5432;UID=MID
> O;PWD=xxxxxxxxxxxxxx;SSLmode=disable;ReadOnly=0;Protocol=7.4-2;FakeOidIndex=
> 0;ShowOidColumn=0;RowVersioning=0;ShowSystemTables=0;ConnSettings=;Fetch=100;
> Socket=4096;UnknownSizes=0;MaxVarcharSize=255;MaxLongVarcharSize=8190;Debug=0
> ;CommLog=0;Optimizer=1;Ksqo=1;UseDeclareFetch=0;TextAsLongVarchar=1;UnknownsA
> sLongVarchar=0;BoolsAsChar=1;Parse=0;CancelAsFreeStmt=0;ExtraSysTablePrefixes
> =dd_;;LFConversion=1;UpdatableCursors=1;DisallowPremature=0;TrueIsMinus1=0;BI
> =0;ByteaAsLongVarBinary=0;UseServerSidePrepare=0;LowerCaseIdentifier=0;XaOpt=
> 1
> 
> 280万件のデータが入ったテーブル(テーブルサイズ:2161MB)に対して、全レコー
> ドを取得する単純なSQLを発行しましたところ、
> エラーが発生しました。

psqlodbcドライバは取得データをメモリに保持しますので、これだけ大量の
データを取得すると大抵の場合メモリーオーバーフローを起こします。回避
するためにはDeclare〜Fetchを使用するをオンにして利用してください。

> #エラーが返ってくるまでの時間は1秒程度です。
> 
> ■エラー内容
> 「[Microsoft OLE DB Provider for ODBC Drivers] Out of memory while reading
> tuples.;Error while executing the query (SQLState:S1000)」
> 
> ■メモリの消費量
> クライアントメモリ⇒仮想メモリ300MB 実メモリ60MB
> サーバメモリ⇒接続時から仮想メモリ158MB  実メモリ38MBでほぼ安定
> 
> メモリの消費量からして、メモリの制限にひっかかったとは考えにくいのですが...
> お手数ですが以下の2つについて教授願えないでしょうか。
> 1.サーバorクライアントの問題どちらであるか
> 2.エラーとなる原因
> 以上お願いいたします。



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