PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Cursores com postgres, onde estão os dados armazenados e quantas chamadas para o banco de dados


O conjunto de dados para um cursor é preparado pelo servidor no momento da execução do primeiro FETCH. O aplicativo cliente recebe apenas os resultados das instruções FETCH subsequentes.

Se o servidor não puder usar índices para manter um cursor, o conjunto de dados temporário será criado. Você pode realizar este teste simples:
create table test(i int, v text);
insert into test
select i, i::text
from generate_series(1, 5000000) i;

Execute as instruções neste script uma a uma:
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;

O primeiro FETCH (*) é executado aproximadamente ao mesmo tempo que a criação de uma tabela temporária semelhante:
create temp table temp_test as
select * from test
order by random();             -- 51684 ms

Alguns drivers podem ter sua própria implementação de cursor no lado do cliente. Isso deve ser descrito explicitamente na documentação do driver.