Der Datensatz für einen Cursor wird vom Server zum Zeitpunkt der Ausführung des ersten FETCH vorbereitet. Die Clientanwendung erhält nur die Ergebnisse nachfolgender FETCH-Anweisungen.
Wenn der Server keine Indizes verwenden kann, um einen Cursor zu verwalten, wird die temporäre Datei erstellt. Sie können diesen einfachen Test durchführen:
create table test(i int, v text);
insert into test
select i, i::text
from generate_series(1, 5000000) i;
Führen Sie die Anweisungen in diesem Skript nacheinander aus:
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;
First FETCH (*) wird ungefähr zur gleichen Zeit ausgeführt wie die Erstellung einer ähnlichen temporären Tabelle:
create temp table temp_test as
select * from test
order by random(); -- 51684 ms
Einige Treiber haben möglicherweise ihre eigene Cursor-Implementierung auf der Client-Seite. Dies sollte explizit in der Dokumentation des Treibers beschrieben werden.