Si le planificateur de requêtes prend de mauvaises décisions, c'est principalement l'une des deux choses suivantes :
1. Les statistiques sont inexacts.
Exécutez-vous ANALYZE
suffisant? Également populaire sous sa forme combinée VACUUM ANALYZE
. Si autovacuum est activé (ce qui est la valeur par défaut dans Postgres moderne), ANALYZE
est exécuté automatiquement. Mais considérez :
- Est-ce que l'ANALYSE DU VIDE régulière est toujours recommandée sous 9.1 ?
Si votre table est grande et la distribution des données est irrégulière , augmentant le default_statistics_target
peut aider. Ou plutôt, définissez simplement la cible des statistiques pour les colonnes pertinentes (celles dans WHERE
ou JOIN
clauses de vos requêtes, en gros) :
ALTER TABLE ... ALTER COLUMN ... SET STATISTICS 400; -- calibrate number
La cible peut être définie dans la plage de 0 à 10 000 ;
Exécutez ANALYZE
à nouveau après cela (sur les tables pertinentes).
2. Les paramètres de coût pour les estimations du planificateur sont désactivées.
Lisez le chapitre Constantes de coût du planificateur dans le manuel.
Regardez les chapitres default_statistics_target et random_page_cost sur cette page Wiki PostgreSQL généralement utile.
Il existe de nombreuses autres raisons possibles, mais ce sont de loin les plus courantes.