Я хочу знать, как CURSOR
и FETCH
внутренне работают в PostgreSQL
.
Сначала я предположил, что
Когда CURSOR
объявляется с оператором select
, DB выполнит оператор select
и сохранит результат в памяти БД.
Когда FETCH
вызывается на CURSOR
, DB будет просто читать результат, перемещаясь по CURSOR
.
Когда CURSOR
закрыт, сохраненные результаты удаляются из памяти.
Если мое предположение верно, FETCH
должно иметь короткое время ответа независимо от того, насколько сложен оператор select
.
Однако, когда я проверяю, FETCH
показывает меньшее время ответа, чемЯ ожидал, что Он сделал то, чего не ожидал.
Как они работают?
--------- РЕДАКТИРОВАТЬ ---------
Ниже приведено то, что я получаю, когда тестирую свою фактическую таблицу базы данных.(Оператор select
содержит предложение join
для 3 таблиц, а в одной из таблиц содержится 3 миллиона строк)
( 8sec) DECLARE “123" NO SCROLL CURSOR WITH HOLD FOR SELECT .....
(0.04sec) FETCH FORWARD 2 FROM "123";
( 4sec) FETCH FORWARD 10000 FROM "123";
--------- EDIT ---------
Время отклика 4сек в FETCH FORWARD 10000 FROM "123"
кажется из-за pgcli
(клиентского инструмента PostgreSQL), который я использовал.
Я не знаю почему, но он явно стал быстрымдо 0,04 с после смены клиентского инструмента.