sql >> Base de Datos >  >> RDS >> PostgreSQL

postgresql:offset + limit llega a ser muy lento

Utilice un cursor en su lugar. Usar un DESPLAZAMIENTO y un LÍMITE es bastante costoso, porque pg tiene que ejecutar una consulta, procesar y omitir filas de DESPLAZAMIENTO. OFFSET es como "saltar filas", que es caro.

documentación del cursor

El cursor permite una iteración sobre una consulta.

BEGIN
DECLARE C CURSOR FOR SELECT * FROM big_table;
FETCH 300 FROM C; -- get 300 rows
FETCH 300 FROM C; -- get 300 rows
...
COMMIT;

Probablemente pueda usar un cursor del lado del servidor sin el uso explícito de la declaración DECLARE, solo con soporte en psycopg (sección de búsqueda sobre cursores del lado del servidor).