De dataset voor een cursor wordt voorbereid door de server op het moment van uitvoering van de eerste FETCH. De clienttoepassing ontvangt alleen de resultaten van volgende FETCH-instructies.
Als de server geen indexen kan gebruiken om een cursor te onderhouden, wordt de tijdelijke dataset aangemaakt. U kunt deze eenvoudige test uitvoeren:
create table test(i int, v text);
insert into test
select i, i::text
from generate_series(1, 5000000) i;
Voer de instructies in dit script één voor één uit:
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 (*) werkt ongeveer rond dezelfde tijd als het maken van een vergelijkbare tijdelijke tabel:
create temp table temp_test as
select * from test
order by random(); -- 51684 ms
Sommige stuurprogramma's hebben mogelijk hun eigen implementatie van de cursor aan de clientzijde. Dit moet expliciet worden beschreven in de documentatie van de bestuurder.