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.
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.
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.
Robert Haas <[email protected]>