[pgsql-jp: 40511] Re: 大容量のテーブルに対してSQLを発行するとエラーになる件について
Hiroshi Inoue
inoue @ tpf.co.jp
2010年 11月 5日 (金) 17:59:26 JST
井上です。
(2010/11/05 12:31), toshihideka4316 @ zenrin.co.jp wrote:
> お世話になります、片山です。
>
> PostgreSQL8.2.14(サーバ、クライアント共に)+ODBC(ドライバver8.2.4)を使用して
> おります。
> DeclearFetchとクライアントカーソル・サーバカーソルの組み合わせを変えながら容
DeclearでなくDeclareです。
Declare cursorとfetchコマンドを使用してデータを小出しに処理
するイメージです。
> 量が約2GBのテーブルに対して全件取得SQLを発行してみました。
> 結果は以下の通りです。
>
> ・DeclearFetch=1、サーバカーソル使用⇒正常終了
> クライアントメモリ⇒仮想メモリ220MB 実メモリ28MB
> サーバメモリ⇒仮想メモリ+1MB 実メモリ+33MB
>
> ・DeclearFetch=1、クライアントカーソル使用⇒異常終了
> エラー:「データプロバイダまたはほかのサービスがE_FAIL状態を返しました。」
> クライアントメモリ⇒仮想メモリ1.9GB 実メモリ1GB
> サーバメモリ⇒仮想メモリ+1MB 実メモリ+35MB
>
> ・DeclearFetch=0、サーバカーソル使用⇒APがだんまりになる
> クライアントメモリ⇒仮想メモリ600MB 実メモリ400MB
> サーバメモリ⇒仮想メモリ+1MB 実メモリ+35MB
>
> ・DeclearFetch=0、クライアントカーソル使用⇒異常終了(先に報告したパターン)
> エラー:「[Microsoft OLE DB Provider for ODBC Drivers] Out of memory while
> reading tuples.;Error while executing the query (SQLState:S1000)」
> クライアントメモリ⇒仮想メモリ300MB 実メモリ60MB
> サーバメモリ⇒仮想メモリ+3MB 実メモリ+3MB
>
> 以上のように、APによってDeclearFetchとカーソルの使い分けが必要だと思うので
> すが、使い分け方がわかりません。
基本的にはサーバーカーソルを使用してください。クライアントカーソルは
間にカーソルライブラリが介入するのですが詳細は不明です。上の結果を
見る限りは結局は全データを取得してしまうようですね。
pgsql-jp メーリングリストの案内