Passer au contenu principal
eLearner.app
Module 10 · Leçon 2 sur 438/57 dans le cours~15 min
Leçons du module (2/4)

EXPLAIN et ANALYZE

Vous êtes-vous déjà demandé comment la base de données choisit d'utiliser ou non le bel index que vous venez de créer ? Dès que vous appuyez sur Entrée pour une requête (par exemple, une longue jointure avec un groupe chaîné par), le Query Planner calcule des dizaines de stratégies à la volée pour exécuter la requête et sélectionne celle que l'on croit, en théorie, la plus rapide.

Mais en tant que développeur, vous devez être capable de regarder dans l'esprit sombre du planificateur de requêtes.

EXPLIQUER

Pour découvrir comment le Planner compte procéder, il suffit de mettre le mot magique EXPLAIN au début de votre requête.

SQL
EXPLAIN SELECT * FROM orders WHERE status = 'delivered';

Le résultat ne sera pas les commandes ! Au lieu de cela, vous verrez le plan en sortie (avec des statistiques estimées) :

Code
Seq Scan on orders  (cost=0.00..25.88 rows=15 width=40)
  Filter: (status = 'delivered'::text)

Cela nous dit :

  1. Le planificateur utilisera un Seq Scan (lecture brute et séquentielle de l'intégralité du disque). C'est mauvais s'il y a des milliards de commandes.
  2. Il estime qu'environ 15 lignes seront renvoyées et calcule le « coût » en cycles CPU préchargés.

EXPLIQUER ANALYSER

Alors qu'EXPLAIN s'appuie sur des suppositions algorithmiques (basées sur des statistiques globales calculées au cours des dernières heures sur les données), EXPLAIN ANALYZE exécute en fait la requête pour de vrai (et attend les résultats logiques complets), en comparant le temps réel écoulé en termes mathématiques absolus.

SQL
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 90;
Code
Index Scan using idx_orders_cust on orders  (cost=0.15..8.13 rows=4 width=40) (actual time=0.012..0.015 rows=4 loops=1)
  Index Cond: (customer_id = 90)
Planning Time: 0.081 ms
Execution Time: 0.033 ms

Hourra! Vous apprenez ici que la base de données a décidé d'appliquer un Index Scan sur notre index secondaire idx_orders_cust, prenant un temps d'exécution microscopique d'un millième de seconde, sautant des millions de lignes à la volée.

A ton tour

Exercice#sql.m10.l2.e1
Tentatives : 0Chargement…

Écrivez une commande EXPLAIN de base pour découvrir comment PostgreSQL a l'intention de trouver des produits avec un stock actuel inférieur à 10 unités. (N'utilisez pas ANALYZE dans cette étape.)

Chargement de l'éditeur…
Afficher l'indice

Ajoutez simplement le mot EXPLAIN au début de l’instruction existante.

Solution disponible après 3 tentatives

Obtenir des statistiques véridiques

Exercice#sql.m10.l2.e2
Tentatives : 0Chargement…

Nous voulons un véritable diagnostic de performance (timings et cycles), pas une esquisse mathématiquement devinée. Utilisez l'instruction dédiée pour étudier, en l'exécutant réellement, la recherche de TOUS les 'clients' inscrits avant le 1er janvier 2025 ("signed_up_on" < '2025-01-01').

Chargement de l'éditeur…
Afficher l'indice

Ajoutez le mot ANALYSER juste après EXPLIQUER.

Solution disponible après 3 tentatives