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