sql >> Databáze >  >> RDS >> PostgreSQL

Kurzory s postgresem, kde jsou data uložena a kolik volání do DB

Datová sada pro kurzor je připravena serverem v době provedení prvního FETCH. Klientská aplikace obdrží pouze výsledky následných příkazů FETCH.

Pokud server nemůže použít indexy k udržení kurzoru, vytvoří se dočasná datová sada. Můžete provést tento jednoduchý test:

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

Proveďte příkazy v tomto skriptu jeden po druhém:

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 provádí zhruba ve stejnou dobu jako vytvoření podobné dočasné tabulky:

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

Některé ovladače mohou mít vlastní implementaci kurzoru na straně klienta. To by mělo být výslovně popsáno v dokumentaci ovladače.




  1. Proč při navazování připojení k serveru SQL došlo k chybě související se sítí nebo specifickou instancí?

  2. PDO bindValue s \PDO::PARAM_BOOL způsobí, že provedení příkazu tiše selže

  3. Jak RLIKE funguje v MariaDB

  4. Mysql:provedení příkazu odepřeno uživateli ''@'localhost' pro rutinní chybu