Datasættet for en markør forberedes af serveren på tidspunktet for udførelse af den første FETCH. Klientapplikationen modtager kun resultaterne af efterfølgende FETCH-udsagn.
Hvis serveren ikke kan bruge indekser til at vedligeholde en markør, oprettes det midlertidige datasæt. Du kan udføre denne simple test:
create table test(i int, v text);
insert into test
select i, i::text
from generate_series(1, 5000000) i;
Udfør sætningerne i dette script én efter én:
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 (*) udfører nogenlunde samme tid som oprettelsen af en lignende midlertidig tabel:
create temp table temp_test as
select * from test
order by random(); -- 51684 ms
Nogle drivere kan have deres egen implementering af markøren på klientsiden. Dette bør udtrykkeligt beskrives i førerens dokumentation.