</>
Plan du cours — 62/64

Diagnostiquer une requête lente

Avancé

Une méthode en cinq étapes évite de deviner : mesurer, comprendre, corriger, vérifier.

La démarche#

  1. Reproduire avec les vrais paramètres et un volume réaliste (\timing, EXPLAIN (ANALYZE, BUFFERS)).
  2. Comparer estimations et réalité : un grand écart rows= / actual rows= indique des statistiques faussées (ANALYZE, statistiques étendues).
  3. Trouver le nœud coûteux : le plus grand actual time, en tenant compte de loops.
  4. Corriger avec le levier adapté (tableau ci-dessous).
  5. Vérifier : refaire l'EXPLAIN et surveiller pg_stat_statements après déploiement.

Symptôme → piste#

Symptôme dans le planCause probablePiste
Seq Scan sur grosse table, peu de lignes ramenéesIndex manquant ou inutilisableCréer l'index ; éviter les fonctions sur la colonne
Rows Removed by Filter énormeFiltre appliqué après lectureIndex (éventuellement partiel ou composite)
Estimations très faussesStatistiques obsolètes ou colonnes corréléesANALYZE, CREATE STATISTICS
Sort Method: external mergework_mem trop bas pour ce triIndex qui fournit l'ordre, ou augmenter work_mem pour la session
Nested Loop avec loops énormeMauvais choix de jointure, estimation basseStatistiques, index sur la clé jointe
Beaucoup de shared readDonnées non cachéesIndex plus sélectif, plus de RAM, réduire les colonnes lues
Milliers de requêtes très rapidesProblème N+1Regrouper (JOIN, = ANY($1))
Lenteur intermittenteVerrous, autovacuum, checkpoint, plan différent selon les paramètrespg_stat_activity, log_lock_waits, auto_explain

Piège : optimiser en local sur 1 000 lignes n'a aucun sens : le planificateur choisit d'autres plans à 10 millions de lignes. Testez sur un jeu de données de taille et de distribution proches de la production.