PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Cursor mit Postgres, wo werden die Daten gespeichert und wie viele Aufrufe an die DB

Der Datensatz für einen Cursor wird vom Server zum Zeitpunkt der Ausführung des ersten FETCH vorbereitet. Die Clientanwendung erhält nur die Ergebnisse nachfolgender FETCH-Anweisungen.

Wenn der Server keine Indizes verwenden kann, um einen Cursor zu verwalten, wird die temporäre Datei erstellt. Sie können diesen einfachen Test durchführen:

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

Führen Sie die Anweisungen in diesem Skript nacheinander aus:

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 (*) wird ungefähr zur gleichen Zeit ausgeführt wie die Erstellung einer ähnlichen temporären Tabelle:

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

Einige Treiber haben möglicherweise ihre eigene Cursor-Implementierung auf der Client-Seite. Dies sollte explizit in der Dokumentation des Treibers beschrieben werden.