PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgresql - Consulta rodando muito mais rápido com enable_nestloop=false. Por que o planejador não está fazendo a coisa certa?


Se o planejador de consulta escolher planos de consulta abaixo do ideal, é provável que ele tenha informações incompletas ou enganosas para trabalhar.

Veja esta página Wiki do PostgreSQL no ajuste do servidor. Preste atenção especialmente aos capítulos sobre random_page_cost e default_statistics_target .
Leia também os capítulos correspondentes no manual sobre Estatísticas Usado pelo planejador e Constantes de custo do planejador .

Mais especificamente, pode ajudar a aumentar a statistics target para as seguintes colunas:
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;

Estes estão envolvidos nos filtros resultando na

mais . Verifique todas as colunas onde a plaina se desvia muito da estimativa. O padrão é apenas 100. Só faz sentido para tabelas com>> 1000 linhas. Experimente com a configuração. Execute ANALYZE nas tabelas posteriormente para que as alterações entrem em vigor.

Também pode ajudar a criar um índice parcial em postgres(sales_orders.retailer_id) WHERE retailer_id IS NOT NULL (dependendo de quão comuns são os valores NULL).

Outra coisa que pode ajudá-lo é atualizar para a versão mais recente 9.1. Houve uma série de melhorias substanciais nesta área.