Zamiast tego użyj kursora. Używanie OFFSET i LIMIT jest dość drogie - ponieważ pg musi wykonać zapytanie, przetworzyć i pominąć wiersze OFFSET. PRZESUNIĘCIE jest jak „pomijanie wierszy”, które jest drogie.
Kursor umożliwia iterację jednego zapytania.
BEGIN
DECLARE C CURSOR FOR SELECT * FROM big_table;
FETCH 300 FROM C; -- get 300 rows
FETCH 300 FROM C; -- get 300 rows
...
COMMIT;
Prawdopodobnie możesz użyć kursora po stronie serwera bez wyraźnego użycia instrukcji DECLARE, tylko z obsługą w psycopg (sekcja wyszukiwania o kursorach po stronie serwera).