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

toshihideka4316 @ zenrin.co.jp toshihideka4316 @ zenrin.co.jp
2010年 11月 5日 (金) 12:31:19 JST


お世話になります、片山です。

PostgreSQL8.2.14(サーバ、クライアント共に)+ODBC(ドライバver8.2.4)を使用して
おります。
DeclearFetchとクライアントカーソル・サーバカーソルの組み合わせを変えながら容
量が約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とカーソルの使い分けが必要だと思うので
すが、使い分け方がわかりません。
上記4パターンのメカニズム(メモリ確保の方法等)の違いを教えていただけないで
しょうか。

以上お願いたします。




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