sql >> Base de Datos >  >> RDS >> PostgreSQL

Cursores con postgres, dónde se almacenan los datos y cuántas llamadas a la base de datos

El servidor prepara el conjunto de datos para un cursor en el momento de la ejecución del primer FETCH. La aplicación cliente recibe solo los resultados de las declaraciones FETCH posteriores.

Si el servidor no puede usar índices para mantener un cursor, se crea el conjunto de datos temporal. Puedes realizar esta sencilla prueba:

create table test(i int, v text);
insert into test
select i, i::text
from generate_series(1, 5000000) i;

Ejecute las declaraciones en este script una por 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;

First FETCH (*) se realiza aproximadamente al mismo tiempo que la creación de una tabla temporal similar:

create temp table temp_test as
select * from test
order by random();             -- 51684 ms

Algunos controladores pueden tener su propia implementación de cursor en el lado del cliente. Esto debe estar descrito explícitamente en la documentación del controlador.