PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 18 beta 2 » Annexes » Modules et extensions supplémentaires fournis » pg_overexplain -- permet à EXPLAIN d'afficher encore plus de détails

F.29. pg_overexplain -- permet à EXPLAIN d'afficher encore plus de détails #

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.

F.29.1. EXPLAIN (DEBUG) #

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).

F.29.2. EXPLAIN (RANGE_TABLE) #

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.

F.29.3. Auteur #

Robert Haas