Il dataset per un cursore viene preparato dal server al momento dell'esecuzione del primo FETCH. L'applicazione client riceve solo i risultati delle successive istruzioni FETCH.
Se il server non può utilizzare gli indici per mantenere un cursore, viene creato il set di dati temporaneo. Puoi eseguire questo semplice test:
create table test(i int, v text);
insert into test
select i, i::text
from generate_series(1, 5000000) i;
Esegui le istruzioni in questo script una per una:
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;
Il primo FETCH (*) viene eseguito all'incirca nello stesso periodo della creazione di una tabella temporanea simile:
create temp table temp_test as
select * from test
order by random(); -- 51684 ms
Alcuni driver potrebbero avere la propria implementazione del cursore sul lato client. Questo dovrebbe essere esplicitamente descritto nella documentazione del conducente.