Utilisez plutôt un curseur. L'utilisation d'un OFFSET et d'une LIMIT est assez coûteuse - car pg doit exécuter une requête, traiter et ignorer des lignes OFFSET. OFFSET c'est comme "sauter des lignes", c'est cher.
Le curseur permet une itération sur une requête.
BEGIN
DECLARE C CURSOR FOR SELECT * FROM big_table;
FETCH 300 FROM C; -- get 300 rows
FETCH 300 FROM C; -- get 300 rows
...
COMMIT;
Vous pouvez probablement utiliser un curseur côté serveur sans utiliser explicitement l'instruction DECLARE, juste avec le support dans psycopg (section de recherche sur les curseurs côté serveur).