F.29. pg_overexplain — permitir a EXPLAIN volcar aún más detalles #

F.29.1. EXPLAIN (DEBUG)
F.29.2. EXPLAIN (RANGE_TABLE)
F.29.3. Autor

El módulo pg_overexplain extiende EXPLAIN con nuevas opciones que proporcionan una salida adicional. Está destinado principalmente a ayudar en la depuración y desarrollo del planificador, en lugar de para un uso general. Dado que este módulo muestra detalles internos de las estructuras de datos del planificador, puede ser necesario consultar el código fuente para comprender la salida. Además, es probable que la salida cambie cada vez (y tan a menudo como) que cambien esas estructuras de datos.

Para usarlo, simplemente cárgalo en el servidor. Puedes cargarlo en una sesión individual:

LOAD 'pg_overexplain';

También puedes precargarlo en algunas o todas las sesiones incluyendo pg_overexplain en session_preload_libraries o shared_preload_libraries en postgresql.conf.

F.29.1. EXPLAIN (DEBUG) #

La opción DEBUG muestra información diversa del árbol del plan que normalmente no se muestra porque no se espera que sea de interés general. Para cada nodo del plan individual, mostrará los siguientes campos. Consulta Plan en nodes/plannodes.h para obtener documentación adicional sobre estos campos.

  • Disabled Nodes. El comando EXPLAIN normal determina si un nodo está deshabilitado comprobando si el recuento de nodos deshabilitados del nodo es mayor que la suma de los recuentos de los nodos subyacentes. Esta opción muestra el valor bruto del contador.

  • Parallel Safe. Indica si sería seguro para un nodo del árbol del plan aparecer debajo de un nodo Gather o Gather Merge, independientemente de si realmente está debajo de dicho nodo.

  • Plan Node ID. Un número de ID interno que debería ser único para cada nodo en el árbol del plan. Se utiliza para coordinar la actividad de las consultas paralelas.

  • extParam y allParam. Información sobre qué parámetros numerados afectan a este nodo del plan o a sus hijos. En modo de texto, estos campos solo se muestran si no son conjuntos vacíos.

Una vez por consulta, la opción DEBUG mostrará los siguientes campos. Consulta PlannedStmt en nodes/plannodes.h para obtener detalles adicionales.

  • Command Type. Por ejemplo, select o update.

  • Flags. Una lista separada por comas de nombres de miembros de estructura booleanos de PlannedStmt que están establecidos a true. Cubre los siguientes miembros de estructura: hasReturning, hasModifyingCTE, canSetTag, transientPlan, dependsOnRole, parallelModeNeeded.

  • Subplans Needing Rewind. IDs enteros de subplanes que pueden necesitar ser rebobinados por el ejecutor.

  • Relation OIDs. OIDs de las relaciones de las que depende este plan.

  • Executor Parameter Types. OID de tipo para cada parámetro del ejecutor (por ejemplo, cuando se elige un bucle anidado y se utiliza un parámetro para pasar un valor a un escaneo de índice interno). No incluye los parámetros suministrados a una sentencia preparada por el usuario.

  • Parse Location. Ubicación dentro de la cadena de consulta suministrada al planificador donde se puede encontrar el texto de esta consulta. Puede ser Unknown en algunos contextos. De lo contrario, puede ser NNN to end para algún entero NNN o NNN for MMM bytes para algunos enteros NNN y MMM.

F.29.2. EXPLAIN (RANGE_TABLE) #

La opción RANGE_TABLE muestra información del árbol del plan específicamente concerniente a la tabla de rangos (range table) de la consulta. Las entradas de la tabla de rangos corresponden aproximadamente a los elementos que aparecen en la cláusula FROM de la consulta, pero con numerosas excepciones. Por ejemplo, las subconsultas que se demuestran innecesarias pueden eliminarse de la tabla de rangos por completo, mientras que la expansión de herencia añade entradas a la tabla de rangos para las tablas hijas que no se nombran directamente en la consulta.

Generalmente se hace referencia a las entradas de la tabla de rangos dentro del plan de consulta mediante un índice de tabla de rangos, o RTI (range table index). Los nodos del plan que hacen referencia a uno o más RTIs se etiquetarán en consecuencia, utilizando uno de los siguientes campos: Scan RTI, Nominal RTI, Exclude Relation RTI, Append RTIs.

Además, la consulta en su conjunto puede mantener listas de índices de tablas de rangos que son necesarios para diversos fines. Estas listas se mostrarán una vez por consulta, etiquetadas según corresponda como Unprunable RTIs o Result RTIs. En modo de texto, estos campos solo se muestran si no son conjuntos vacíos.

Finalmente, pero lo más importante, la opción RANGE_TABLE mostrará un volcado de toda la tabla de rangos de la consulta. Cada entrada de la tabla de rangos está etiquetada con el índice de la tabla de rangos correspondiente, el tipo de entrada de la tabla de rangos (por ejemplo, relation, subquery o join), seguido por el contenido de varios campos de entrada de la tabla de rangos que normalmente no forman parte de la salida de EXPLAIN. Algunos de estos campos solo se muestran para ciertos tipos de entradas de la tabla de rangos. Por ejemplo, Eref se muestra para todos los tipos de entradas de la tabla de rangos, pero CTE Name se muestra solo para las entradas de la tabla de rangos de tipo cte.

Para obtener más información sobre las entradas de la tabla de rangos, consulta la definición de RangeTblEntry en nodes/parsenodes.h.

F.29.3. Autor #

Robert Haas