Вместо това използвайте курсор. Използването на OFFSET и LIMIT е доста скъпо - защото pg трябва да изпълни заявка, да обработи и да пропусне OFFSET редове. OFFSET е като "пропускане на редове", което е скъпо.
Курсорът позволява итерация върху една заявка.
BEGIN
DECLARE C CURSOR FOR SELECT * FROM big_table;
FETCH 300 FROM C; -- get 300 rows
FETCH 300 FROM C; -- get 300 rows
...
COMMIT;
Вероятно можете да използвате курсор от страна на сървъра без изрично използване на израза DECLARE, само с поддръжка в psycopg (раздел за търсене относно курсори от страна на сървъра).