PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Курсори с postgres, къде се съхраняват данните и колко извиквания към БД

Наборът от данни за курсор се подготвя от сървъра по време на изпълнение на първия FETCH. Клиентското приложение получава само резултатите от последващи оператори FETCH.

Ако сървърът не може да използва индекси за поддържане на курсор, се създава временният набор от данни. Можете да извършите този прост тест:

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

Изпълнете операторите в този скрипт един по един:

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 (*) се изпълнява приблизително по същото време като създаването на подобна временна таблица:

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

Някои драйвери може да имат собствена реализация на курсор от страна на клиента. Това трябва да бъде изрично описано в документацията на драйвера.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Инсталиране на pg -v 0.17.1

  2. PostgreSQL - как да определите дали транзакцията е активна?

  3. Може ли PostgreSQL да индексира колони от масиви?

  4. PG::Грешка:ГРЕШКА:новото кодиране (UTF8) е несъвместимо

  5. Ролята за премахване на PostgreSQL е неуспешна поради привилегии по подразбиране