Bases de données

Votre requête est lente ? Visualisez son plan d'exécution EXPLAIN

Lire un plan d'exécution EXPLAIN brut est une corvée. Collez-le dans LetDraw et regardez la partie lente s'illuminer.

Vous livrez la fonctionnalité, elle marche sur votre portable, puis un endpoint met trois secondes en production. Vous savez déjà que le coupable est une requête. Ce que vous ne savez pas, c'est quelle partie de cette requête, et l'outil censé vous le dire vous renvoie un mur de texte indenté avec des chiffres qu'il faut déchiffrer en plissant les yeux.

Ce mur de texte est un plan EXPLAIN, et il contient toute la réponse. La base de données vous dit exactement comment elle va exécuter votre requête, nœud par nœud, avec un coût pour chacun. Le problème, c'est le format. Un plan brut est dense, profondément imbriqué et optimisé pour un parseur, pas pour une personne qui le lit un vendredi à 16 h. Alors la plupart d'entre nous cherchent le mot « Seq Scan », ressentent une vague angoisse et passent à autre chose.

Un plan EXPLAIN PostgreSQL ou MySQL est un arbre déguisé en texte

Tout plan EXPLAIN est en réalité un arbre. La racine est le résultat final, ses enfants sont les étapes qui l'alimentent, et chaque étape porte un coût estimé. Quand vous l'affichez en texte, cette structure est aplatie en indentation, et la seule chose qui vous intéresse vraiment (où passe le temps) se retrouve noyée parmi les lignes, les largeurs et les nombres de boucles.

La solution est d'arrêter de lire l'arbre comme du texte et de commencer à le voir comme un arbre. Demandez d'abord la forme lisible par une machine :

psql
-- Postgres: ask for JSON so the plan keeps its structure
EXPLAIN (ANALYZE, FORMAT JSON)
SELECT u.name, count(o.id)
FROM users u
JOIN orders o ON o.user_id = u.id
WHERE o.created_at > '2026-01-01'
GROUP BY u.name;

Postgres (et MySQL, avec son propre FORMAT=JSON) répondra par un document JSON au lieu du texte habituel. Il ressemble à ceci, et honnêtement il n'est pas beaucoup plus agréable à lire à la main :

plan.json
[{ "Plan": {
  "Node Type": "Hash Join",
  "Total Cost": 18422.6,
  "Plans": [
    { "Node Type": "Seq Scan",
      "Relation Name": "orders",
      "Total Cost": 15903.0 },
    { "Node Type": "Index Scan",
      "Relation Name": "users",
      "Total Cost": 211.4 }
  ] } }]

Collez-le, et la partie lente s'illumine

Copiez ce JSON, ouvrez la boîte de dialogue Générer à partir du code de LetDraw et collez. Inutile de lui dire ce qu'il regarde. LetDraw détecte automatiquement un plan EXPLAIN Postgres ou MySQL et l'affiche sous forme d'arbre de plan en carte de chaleur : le vrai arbre, dessiné, avec chaque nœud coloré selon son coût.

Le nœud le plus coûteux est le plus rouge. Voilà toute la revue, en un coup d'œil.

Les nœuds chauds brillent en rouge et en orange ; les nœuds peu coûteux restent verts. Au lieu d'analyser les coûts à l'œil, vous regardez l'image et votre attention va droit au goulot d'étranglement.

Hash Join coût 18422 Seq Scan orders coût 15903 Index Scan users coût 211 table entière indexé, léger
Le même plan sous forme d'arbre. Le Seq Scan rouge sur orders fait presque tout le travail ; le côté users est déjà indexé.

Le diagnostic devient évident. Le côté orders est un Seq Scan, une lecture complète de la table, tandis que users est déjà servi par un Index Scan. Le hash join coûteux au sommet est coûteux parce qu'il est alimenté par ce parcours complet. L'index manquant sur orders(created_at) n'est pas une déduction tirée d'une colonne de coûts ; c'est la seule boîte rouge de la page.

Votre requête ne quitte jamais le navigateur

C'est souvent la première question des spécialistes des bases de données. Un plan EXPLAIN peut révéler des noms de tables, des noms de colonnes et des estimations de lignes que vous préféreriez ne pas confier à un outil web quelconque. LetDraw fait tout côté client. L'analyse et la mise en page ont lieu dans votre navigateur, sur votre machine. Rien de votre requête ni de votre schéma n'est envoyé à un serveur pour produire l'image.

  • Collez un plan issu d'une base de production sans qu'il quitte votre portable
  • Aucun compte ni téléversement nécessaire pour transformer un plan en arbre
  • La même confidentialité s'applique, que vous utilisiez l'application hébergée ou que vous l'auto-hébergiez
Astuce. Utilisez EXPLAIN (ANALYZE) quand vous pouvez vous permettre d'exécuter réellement la requête. Les coûts deviennent des durées mesurées au lieu d'estimations, et la carte de chaleur reflète où le temps est vraiment passé, pas seulement où le planificateur pensait qu'il passerait.

C'est un diagramme, vous pouvez donc agir dessus

L'arbre du plan n'est pas une image statique. Il est composé des mêmes formes modifiables que tout le reste dans LetDraw : dès que vous repérez le problème, vous pouvez en faire quelque chose qu'un collègue comprendra.

  • Entourez le chemin chaud et ajoutez une note expliquant l'index manquant
  • Collez les plans avant et après côte à côte pour montrer que le correctif a fonctionné
  • Exportez en PNG, SVG ou PDF et joignez-le à la pull request ou au compte rendu d'incident

Un plan brut, c'est ce qu'un ingénieur déchiffre seul. Un arbre en carte de chaleur avec une note sur la boîte rouge, c'est ce que toute la revue comprend en quelques secondes. C'est la différence entre « la requête est lente » et « voici la partie lente, et voici le correctif d'une ligne ». Collez votre prochain plan EXPLAIN et laissez le goulot d'étranglement se présenter de lui-même.

Voyez où votre requête passe son temps

Ouvrez un canevas, collez un plan EXPLAIN et regardez le nœud lent s'illuminer. Il ne quitte jamais votre navigateur.

Ouvrir LetDraw, gratuit