EXPLAIN

Name

EXPLAIN  --  montre le plan d'exécution d'une instruction.

Synopsis

EXPLAIN [ ANALYZE ] [ VERBOSE ] query        
  

Entrées

ANALYZE

Flag to carry out the query and show actual runtimes.

VERBOSE

Montre le plan de requête de façon détaillée.

query

Une requête.

Sorties

NOTICE: QUERY PLAN: plan

Plan de requête explicite du serveur PostgreSQL.

EXPLAIN

Envoyé après que le plan de resuête soit montré.

Description

Cette commande affiche le plan d'exécution que génère le planner PostgreSQL pour les requêtes fournies. Le plan d'exécution monjtre comment la(es) table(s) référencées par la requête seront analysées --- par un scan séquentiel, un scan d'index, etc. --- et si des tables multiples sont référencées, joignant des algorithmes qui seront utilisés pour regrouper les tuples requis depuis chaque entrée table.

La partie la plus critique de l'affichage est le coût estimé de l'exécution de la requête, qui est l'estimation du planner sur la durée prise pour lancer la requête (mesurée en unités d'accès aux pages disque). Actuellement deux chiffres sont indiqués : le temps de démarrage avant que le premier tuple soit retourné, et le temps total pour retourner tous les tuples. Pour la plupart des requêtes le temps total est de cet ordre, mais dans certains contextes comme une sous-requête EXISTS le planner choisira le temps de démarrage le plus court au lieu du temps total le plus court (car l'exécuteur stoppera après avoir rencontré un tuple). Aussi, si vous limitez le nombre de tuples à l'affichage avec l'instruction LIMIT, le planner fait une interpolation entre les coûts finaux pour estimer quel plan est réellement le moins coûteux.

L'option ANALYZE fait que le requête est exécutée de suite, pas seulement en prévision. Le temps total passé dans chaque plan (en millisecondes) et une nombre total de lignes retournés sont ajoutés à l'affichage. Ceci est pratique pour voir comment le planner fait ses estimations et proche de la réalité.

L'option VERBOSE montre la représentation interne complète de l'arbre de prévision, d'avantage qu'un simple sommaire (et l'envoit au fichier de log du serveur). Habituellement, cette option est seulement utilisée pour le débugage de PostgreSQL.

Caution

Gardez à l'esprit que le requête est exécutée quand ANALYZE est utilisé. Bien que EXPLAIN mettra de côté certaines sorties que SELECT afficherait, d'autres effets secondaires de la requête apparaîtront comme usuels. Si vous voulez utiliser EXPLAIN ANALYZE sur une requête INSERT, UPDATE, ou DELETE sans laisser la requête toucher à vos données, utilisez cette approche :

BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;
      

Notes

Il n'y a que de la documentation éparse sur l'usage de l'optimiseur dans PostgreSQL. Voir le Guide de l'utilisateur et le Guide du programmeur pour plus d'information.

Utilisation

Pour montrer un plan de requête avec une requête simple sur une table ayant une seule colonne int4 et 128 lignes :

EXPLAIN SELECT * FROM foo;
    NOTICE:  QUERY PLAN:

Seq Scan on foo  (cost=0.00..2.28 rows=128 width=4)

EXPLAIN
    
   

La même table avec un index pour supporter une condition equijoin sur la requête, EXPLAIN montrera un plan différent :

EXPLAIN SELECT * FROM foo WHERE i = 4;
    NOTICE:  QUERY PLAN:

Index Scan using fi on foo  (cost=0.00..0.42 rows=1 width=4)

EXPLAIN
    
   

Finalement, la même table avec un index pour supporter une condition equijoin sur la requête, EXPLAIN indiquera ceci pour une requête utilisant une fonction agrégat :

EXPLAIN SELECT sum(i) FROM foo WHERE i = 4;
    NOTICE:  QUERY PLAN:

Aggregate  (cost=0.42..0.42 rows=1 width=4)
  ->  Index Scan using fi on foo  (cost=0.00..0.42 rows=1 width=4)
    
   

Notez que les nombres spécifiques indiqués, et même la stratégie de requête, peuvent varier entre les versions de PostgreSQL en fonction des améliorations du planner.

Compatibilité

SQL92

Il n'y a pas d'instruction EXPLAIN définie en SQL92.