2015-10-01 34 views
5

Witam Używam psycopg2 do dostępu do PostgreSQL.Kursory z postgresem, gdzie są przechowywane dane i ile wywołań do DB

Próbuję zrozumieć, gdzie "kursor" przechowuje zwrócone wiersze. Czy zapisuje go w bazie danych jako tabelę tymczasową lub czy jest na końcu klienta?

Czy kursor (podczas określania pobierania wielu wierszy) trafia do bazy danych kwerendy w tym samym czasie lub trafia w bazę danych jeden raz, uzyskać pierwszy zestaw wyników, a następnie po iteracji nad zwracanymi wartościami, otrzymuje następny set (buforowanie).

Czytałem wiele artykułów na temat kursorem ale nic naprawdę daje wewnętrzną pracę ...

Dziękuję.

+0

Wyślij swój kod testowy –

Odpowiedz

3

Zestaw danych dla kursora jest przygotowywany przez serwer w momencie wykonywania pierwszego FETCH. Aplikacja kliencka otrzymuje tylko wyniki kolejnych instrukcji FETCH.

Jeśli serwer nie może używać indeksów do utrzymywania kursora, tworzony jest tymczasowy zestaw danych. Można wykonać prosty test:

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

wykonać instrukcje w tym skrypcie, jeden po drugim:

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; 

Pierwszy fetch (*) wykonuje mniej więcej w tym samym czasie jak stworzenie podobnej tabeli tymczasowej :

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

Niektóre sterowniki mogą mieć własną implementację kursora po stronie klienta. Należy to wyraźnie opisać w dokumentacji kierowcy.

+0

PostgreSQL nie zawsze zmaterializuje dane takie jak to. Czasami może go pobrać tylko w razie potrzeby. To zależy od dokładnego planu zapytania. Szczerze mówiąc, jestem zaskoczony, że wydaje się, że zmaterializował to w tym przypadku. Zwróć też uwagę, że jest to kursor po stronie serwera. 'Kursory psycopg2 są mapowane na kursory po stronie serwera, więc zachowanie będzie dobrze korespondować, ale niekoniecznie musi to dotyczyć innych sterowników. PgJDBC na przykład domyślnie przyjmuje cały zestaw wyników do pamięci lokalnej. –

+0

@Craig, to tylko przykład. Wybrałem najgorszy przypadek, aby lepiej zilustrować mechanizm używania kursorów. Dzięki za wskazówkę. – klin