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

Postgresql:la consulta se ejecuta mucho más rápido con enable_nestloop=false. ¿Por qué el planificador no está haciendo lo correcto?

Si el planificador de consultas elige planes de consulta subóptimos, es probable que tenga información incompleta o engañosa para trabajar.

Consulte esta página wiki de PostgreSQL en el ajuste del servidor. Preste especial atención a los capítulos sobre random_page_cost y objetivo_estadístico_predeterminado .
Lea también los capítulos correspondientes del manual sobre Estadísticas Utilizado por el Planificador y Constantes de costos del planificador .

Más específicamente, podría ayudar a aumentar el statistics target para las siguientes columnas:

ALTER TABLE postgres.products ALTER COLUMN id SET STATISTICS 1000;
ALTER TABLE postgres.sales_orders ALTER COLUMN retailer_id SET STATISTICS 1000;
ALTER TABLE postgres.sales_orders ALTER COLUMN company_id SET STATISTICS 1000;

ALTER TABLE goods_return_notes ALTER COLUMN retailer_id SET STATISTICS 1000;
ALTER TABLE goods_return_notes ALTER COLUMN company_id SET STATISTICS 1000;

ALTER TABLE retailer_category_leaf_nodes ALTER COLUMN tree_left SET STATISTICS 1000;
ALTER TABLE channels ALTER COLUMN principal_id SET STATISTICS 1000;

Estos están involucrados en los filtros que dan como resultado el

Hay más . Verifique cada columna donde el cepillo se desvía mucho de la estimación. El valor predeterminado es solo 100. Solo tiene sentido para tablas con>> 1000 filas. Experimente con la configuración. Ejecute ANALYZE en las tablas después para que los cambios surtan efecto.

También podría ayudar crear un índice parcial en postgres(sales_orders.retailer_id) WHERE retailer_id IS NOT NULL (dependiendo de cuán comunes sean los valores NULL).

Otra cosa que puede ayudarte es actualizar a la última versión 9.1. Ha habido una serie de mejoras sustanciales en esta área.