Datauppsättningen för en markör förbereds av servern vid tidpunkten för exekvering av den första FETCH. Klientapplikationen tar bara emot resultaten av efterföljande FETCH-satser.
Om servern inte kan använda index för att behålla en markör skapas den tillfälliga datamängden. Du kan utföra detta enkla test:
create table test(i int, v text);
insert into test
select i, i::text
from generate_series(1, 5000000) i;
Utför satserna i det här skriptet en efter en:
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 (*) utförs ungefär samtidigt som skapandet av en liknande temporär tabell:
create temp table temp_test as
select * from test
order by random(); -- 51684 ms
Vissa drivrutiner kan ha sin egen implementering av markören på klientsidan. Detta bör uttryckligen beskrivas i förarens dokumentation.