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.