Skip to content
6 / 10

Как отдавать большие выборки: серверные курсоры, потоковая обработка, лимиты

Обычный драйвер по умолчанию вычитывает весь результат в память до того, как приложение обработает первую строку: выборка на десять миллионов строк превращается в гигабайты в куче и падение процесса. Способов три. Серверный курсор (DECLARE CURSOR, server_side_cursors у драйвера) оставляет результат на стороне базы и отдаёт порциями — память приложения ограничена размером порции, но курсор живёт внутри транзакции, а значит, долгая обработка удерживает транзакцию. Потоковый режим драйвера (stream=True, курсоры с именем) даёт то же без явного курсора. Постраничный обход по ключу (keyset) — обработка независимыми короткими запросами: транзакции короткие, можно прерывать и возобновлять, но нужен стабильный порядок по уникальному ключу. Практическое правило: экспорт и фоновая обработка — keyset-обход чанками; интерактивные ответы — жёсткий LIMIT и отказ отдавать миллионы строк наружу.

Как отдавать большие выборки: серверные курсоры, потоковая обработка, лимиты | JScriptiser