sql >> Databasteknik >  >> RDS >> PostgreSQL

Markörer med postgres, var lagras data och hur många anrop till DB

Datauppsättningen för en markör förbereds av servern vid tidpunkten för exekvering av den första FETCH. Klientapplikationen tar bara emot resultaten av efterföljande FETCH-satser.

Om servern inte kan använda index för att behålla en markör skapas den tillfälliga datamängden. Du kan utföra detta enkla test:

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

Utför satserna i det här skriptet en efter en:

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 (*) utförs ungefär samtidigt som skapandet av en liknande temporär tabell:

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

Vissa drivrutiner kan ha sin egen implementering av markören på klientsidan. Detta bör uttryckligen beskrivas i förarens dokumentation.




  1. DB ORACLE QUERY

  2. Använda tidslinje google chart api med php - DataTable-initiering

  3. PHP ORA-01745:ogiltigt namn på värd/bindningsvariabel Varning

  4. Varför är UNION-frågor så långsamma i MySQL?