Lire un plan avec EXPLAIN et EXPLAIN ANALYZE
AvancéEXPLAIN montre le plan que le planificateur prévoit ; EXPLAIN ANALYZE exécute la requête et compare les estimations à la réalité : c'est l'outil central du diagnostic.
EXPLAIN (ANALYZE, BUFFERS)
SELECT c.nom, sum(o.total)
FROM clients c
JOIN commandes o ON o.client_id = c.id
WHERE o.cree_le >= now() - interval '30 days'
GROUP BY c.nom;
Que regarder#
| Élément | Signification |
|---|---|
cost=0.42..8.44 | Coût estimé : au démarrage .. au total (unité arbitraire) |
rows=1000 vs actual ... rows=52000 | Estimation contre réalité : un grand écart signale des statistiques faussées |
Seq Scan | Lecture complète de la table |
Index Scan / Index Only Scan / Bitmap Heap Scan | Utilisation d'un index |
Nested Loop / Hash Join / Merge Join | Algorithme de jointure |
loops= | Nombre d'exécutions du nœud (multipliez le temps par loops) |
Buffers: shared hit=… read=… | Pages trouvées en cache (hit) ou lues sur disque (read) |
Sort Method: external merge | Le tri a débordé sur disque : work_mem trop petit |
Piège :
EXPLAIN ANALYZEexécute réellement la requête. Pour unUPDATEou unDELETE, entourez-le d'une transaction annulée :BEGIN; EXPLAIN ANALYZE UPDATE ...; ROLLBACK;.
Astuce : lisez un plan de l'intérieur vers l'extérieur et cherchez le nœud où
actual timeest le plus grand, ou où l'estimation s'écarte le plus de la réalité. Des outils comme explain.dalibo.com ou explain.depesz.com rendent les plans lisibles.