Místo toho použijte kurzor. Použití OFFSET a LIMIT je docela drahé - protože pg musí provést dotaz, zpracovat a přeskočit OFFSET řádky. OFFSET je něco jako „přeskakování řádků“, což je drahé.
Kurzor umožňuje iteraci přes jeden dotaz.
BEGIN
DECLARE C CURSOR FOR SELECT * FROM big_table;
FETCH 300 FROM C; -- get 300 rows
FETCH 300 FROM C; -- get 300 rows
...
COMMIT;
Pravděpodobně můžete použít kurzor na straně serveru bez explicitního použití příkazu DECLARE, pouze s podporou v psycopg (vyhledávací sekce o kurzorech na straně serveru).