performance - poner - Si el conteo de PostgreSQL(*) siempre es lento, ¿cómo paginar consultas complejas?
optimizar inner join sql server (2)
¿Leíste el encabezado de ese artículo?
Tenga en cuenta que el siguiente artículo solo se aplica a las versiones de PostgreSQL anteriores a 9.2. Ahora se implementan las exploraciones de índice solamente.
Use 9.2 y generalmente encontrará que obtiene resultados mucho mejores. Lea la página wiki de escaneos de índice solamente para más detalles.
Dicho esto, en versiones anteriores utilizando LIMIT
y OFFSET
generalmente funciona bien. Puede estimar los recuentos de filas (y por lo tanto, los recuentos de páginas) utilizando las estadísticas de la tabla si no le importa un poco de variación. Consulte "Estimación del número de filas" en el artículo al que ya se ha vinculado .
Paginar usando LIMIT
y OFFSET
es, IMO, un anti-patrón de todos modos. La mayoría de las veces puede reformular el código de paginación para que utilice sort_column > ''last_seen_value'' LIMIT 100
, es decir, evita el desplazamiento. Esto a veces puede resultar en ganancias de rendimiento muy grandes.
Si el count(*)
de PostgreSQL count(*)
siempre es lento, ¿cómo paginar consultas complejas?
Hacer disparadores no parece ser una buena solución siempre que en este caso tengamos muchas páginas (por ejemplo, diferentes categorías, filtros, etc.).
¿Qué hacer si VACUUM/VACUUM ANALYZE/ANALYZE/VACUUM FULL
no ayuda? ¿Cuáles son las mejores prácticas para usar count(*)
con postgresql?
Si está realizando el conteo SELECCIONADO (*) de la tabla FROM y tiene las estadísticas pg habilitadas, puede usar el ejemplo inferior, que en este caso va de 13 ms a 0,05 ms.
SELECT count(*) FROM news;
26171
EXPLAIN ANALYZE SELECT count(*) FROM news;
Tiempo de ejecución total: 13.057 ms
SELECT reltuples::bigint AS count FROM pg_class WHERE oid = ''public.news''::regclass;
26171
EXPLAIN ANALYZE SELECT reltuples::bigint AS count FROM pg_class WHERE oid = ''public.news''::regclass;
Tiempo de ejecución total: 0.053 ms