カーソルのデータセットは、最初の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
一部のドライバは、クライアント側のカーソルの独自の実装を有することができます。これは、ドライバのマニュアルに明示的に記述する必要があります。
テストコードを投稿 –