Se o planejador de consultas tomar decisões erradas, é principalmente uma das duas coisas:
1. As estatísticas são imprecisos.
Você executa
ANALYZE
suficiente? Também popular em sua forma combinada VACUUM ANALYZE
. Se o autovacuum estiver ativado (que é o padrão no Postgres moderno), ANALYZE
é executado automaticamente. Mas considere:- O VACUUM ANALYZE regular ainda é recomendado na versão 9.1?
Se sua mesa for grande e a distribuição de dados é irregular , elevando o
default_statistics_target
pode ajudar. Ou melhor, apenas defina o destino das estatísticas para as colunas relevantes (aquelas em WHERE
ou JOIN
cláusulas de suas consultas, basicamente):ALTER TABLE ... ALTER COLUMN ... SET STATISTICS 400; -- calibrate number
O alvo pode ser definido no intervalo de 0 a 10.000;
Execute
ANALYZE
novamente depois disso (em tabelas relevantes). 2. As configurações de custo porque as estimativas do planejador estão desativadas.
Leia o capítulo Constantes de Custo do Planejador no manual.
Veja os capítulos default_statistics_target e random_page_cost nesta página geralmente útil do PostgreSQL Wiki.
Existem muitas outras razões possíveis, mas estas são de longe as mais comuns.