Le module pg_overexplain
étend la commande EXPLAIN
avec de nouvelles options fournissant des sorties supplémentaires. Il est principalement destiné
à aider au débogage et au développement du planificateur, plutôt qu'à une utilisation générale.
Étant donné que ce module affiche des détails internes des structures de données du planificateur,
il peut être nécessaire de se référer au code source pour en comprendre la sortie. De plus,
cette sortie est susceptible d'évoluer aussi souvent que les structures de données qu'elle expose.
L'option DEBUG
affiche des informations diverses issues
de l'arbre de planification qui ne sont normalement pas affichées, car elles ne sont
pas censées être d'intérêt général. Pour chaque nœud de plan individuel, les champs suivants
seront affichés. Voir Plan
dans nodes/plannodes.h
pour une documentation plus détaillée de ces champs.
Disabled Nodes
. La commande EXPLAIN
classique détermine si un nœud est désactivé en comparant le nombre de nœuds désactivés
à la somme de ceux des nœuds sous-jacents. Cette option affiche la valeur brute du compteur.
Parallel Safe
. Indique si un nœud de l'arbre de planification
peut apparaître en toute sécurité sous un nœud Gather
ou
Gather Merge
, indépendamment du fait qu'il y figure
réellement ou non.
Plan Node ID
. Un identifiant interne unique pour chaque nœud
de planification. Il est utilisé pour coordonner l'activité des requêtes parallèles.
extParam
et allParam
. Informations sur les paramètres numérotés
affectant ce nœud du plan ou ses enfants. En mode texte, ces champs ne sont affichés que s'ils
ne sont pas vides.
Une fois par requête, l'option DEBUG
affichera également les champs suivants.
Voir PlannedStmt
dans nodes/plannodes.h
pour plus de détails.
Command Type
. Par exemple, select
ou update
.
Flags
. Une liste séparée par des virgules des membres
booléens de la structure PlannedStmt
ayant la valeur
true
. Cela inclut :
hasReturning
, hasModifyingCTE
,
canSetTag
, transientPlan
,
dependsOnRole
, parallelModeNeeded
.
Subplans Needing Rewind
. Identifiants entiers des sous-plans
susceptibles de devoir être relus par l'exécuteur.
Relation OIDs
. OID des relations dont dépend ce plan.
Executor Parameter Types
. OID de type pour chaque paramètre d'exécuteur
(par exemple, lorsqu'une boucle imbriquée est choisie et qu'un paramètre est utilisé pour
transmettre une valeur à une recherche d'index interne). Cela n'inclut pas les paramètres
fournis par l'utilisateur à une instruction préparée.
Parse Location
. Indique l'emplacement dans la chaîne de requête
transmise au planificateur où le texte de la requête peut être trouvé.
Peut valoir Unknown
dans certains contextes.
Sinon, cela peut être
NNN to end
(NNN
étant un entier) ou
NNN for MMM bytes
(NNN
et MMM
étant des entiers).
L'option RANGE_TABLE
affiche les informations de l'arbre de plan
concernant spécifiquement la table de portée (range table) de la requête. Les entrées
de la table de portée correspondent grossièrement aux éléments figurant dans la clause
FROM
de la requête, mais il existe de nombreuses exceptions. Par exemple,
les sous-requêtes jugées inutiles peuvent être supprimées entièrement de la table de portée,
tandis que l'expansion des héritages ajoute des entrées pour les tables filles non nommées
directement dans la requête.
Les entrées de la table de portée sont généralement référencées dans le plan de requête
par un indice de table de portée (RTI). Les nœuds de plan qui référencent un ou
plusieurs RTI seront annotés à l'aide de l'un des champs suivants :
Scan RTI
, Nominal RTI
,
Exclude Relation RTI
, Append RTIs
.
De plus, la requête dans son ensemble peut maintenir des listes d'indices de table de portée
nécessaires à divers traitements. Ces listes seront affichées une fois par requête
et étiquetées comme Unprunable RTIs
ou Result RTIs
.
En mode texte, ces champs ne sont affichés que s'ils ne sont pas vides.
Enfin, et surtout, l'option RANGE_TABLE
affichera un
vidage complet de la table de portée de la requête. Chaque entrée est annotée
avec son indice, son type (par exemple, relation
,
subquery
, ou join
), suivi du contenu de
divers champs supplémentaires. Certains de ces champs ne sont affichés que
pour certains types d'entrés. Par exemple, Eref
est affiché
pour tous les types d'entrées, mais CTE Name
l'est uniquement
pour les entrées de type cte
.
Pour plus d'informations sur les entrées de la table de portée, se référer à la définition
de RangeTblEntry
dans nodes/plannodes.h
.
Robert Haas <rhaas@postgresql.org>