PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Cursori con postgres, dove sono memorizzati i dati e quante chiamate al DB

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.