2015-10-01 1 views
5

こんにちは私はpsycopg2をpostgresアクセスに使用しています。ポストグルのカーソル、格納されているデータはどこですか、DBへの呼び出し回数

「カーソル」が返される行をどこに格納するかを理解しようとしています。それは一時的なテーブルとしてデータベースに格納されますか、それともクライアント側にありますか?

複数の行をフェッチするように指定すると、一度にデータベースにヒットするか、データベースに1回ヒットして最初の結果セットを取得し、次に返された値を反復処理すると、セット(バッファリング)。

私はカーソル上の複数の記事を読みましたが、何も本当に

ありがとう...内部の作業を与えません。

+0

テストコードを投稿 –

答えて

3

カーソルのデータセットは、最初のFETCHの実行時にサーバーによって準備されます。クライアント・アプリケーションは、後続のFETCHステートメントの結果のみを受け取ります。

サーバーがインデックスを使用してカーソルを維持できない場合、一時データセットが作成されます。同様の一時テーブルの作成と同時期におよそ行い

begin; 

declare cur cursor 
for select * from test 
order by random();    -- 17 ms 

fetch next cur;    -- 37294 ms (*) 

fetch next cur;    -- 0 ms 
fetch prior cur;    -- 0 ms 
fetch absolute 1000000 cur; -- 181 ms 
fetch relative 1000000 cur; -- 163 ms 
fetch first cur;    -- 0 ms 
fetch last cur;    -- 0 ms 

rollback; 

まず(*)FETCH:

create table test(i int, v text); 
insert into test 
select i, i::text 
from generate_series(1, 5000000) i; 

は1で、このスクリプト1でのステートメントを実行します。あなたはこの簡単なテストを実行することができます:

create temp table temp_test as 
select * from test 
order by random();    -- 51684 ms 

一部のドライバは、クライアント側のカーソルの独自の実装を有することができます。これは、ドライバのマニュアルに明示的に記述する必要があります。

+0

PostgreSQLは必ずしもそのようなデータを実現するとは限りません。場合によっては、必要なときにのみフェッチできます。正確なクエリプランによって異なります。率直に言って、私はそれがこのケースでそれを具体化するように思われることに驚いています。また、これはサーバー側のカーソルであることに注意してください。 'psycopg2'のカーソルはサーバ側のカーソルにマップされるので、動作はかなりよく一致しますが、これは他のドライバにとって必ずしも真実ではありません。例えば、PgJDBCはデフォルトでローカルメモリに結果セット全体を受け取ります。 –

+0

@Craig、これはほんの一例です。私はカーソルの使用の仕組みをよりよく説明するために最悪のケースを選んだ。先端に感謝します。 – klin

関連する問題