Cómo se organiza el XML Showplan

El plan gráfico de SSMS se construye a partir de un documento XML. El gráfico facilita la orientación; el XML conserva la estructura completa, los atributos de cada operador y, cuando se trata de un plan real, las métricas observadas durante la ejecución.

Cómo abrir el XML que corresponde al plan

Activa Include Actual Execution Plan con Ctrl+M, ejecuta la consulta y abre Execution plan. Haz clic derecho en una zona vacía del lienzo y selecciona Show Execution Plan XML. SSMS abre otra pestaña con el documento del mismo plan; conserva abierta la pestaña gráfica para relacionar los nodos.

Para volver desde un operador concreto, selecciónalo en el gráfico y presiona F4. Node ID en Properties corresponde con el atributo NodeId de un elemento RelOp dentro del XML. Abrir el XML desde otro plan o desde otra ejecución puede producir identificadores y métricas diferentes.

Esta consulta produce el plan utilizado en las capturas:

SELECT
    p.IdPedido,
    p.IdCliente,
    p.FechaPedido,
    p.Total
FROM dbo.PedidoLaboratorio AS p
WHERE p.IdPedido BETWEEN 100 AND 200
OPTION (MAXDOP 1);

El gráfico y el XML describen el mismo plan

Nodos SELECT y Clustered Index Seek en un plan real de SSMS

  1. 1
    Resultado de la instrucción

    SELECT recibe las filas producidas por el árbol y representa el punto de salida del plan.

  2. 2
    Operador de acceso

    Clustered Index Seek localiza el intervalo solicitado dentro del índice clustered.

El XML no añade un segundo plan. Describe estos mismos nodos mediante elementos anidados. Un elemento XML es una sección delimitada por una etiqueta, como <RelOp>. Un atributo es un dato escrito dentro de la etiqueta de apertura, como NodeId="0".

La jerarquía conduce desde el documento hasta cada operador

Jerarquía principal del XML Showplan en SSMS

  1. 1
    ShowPlanXML

    Es el elemento raíz. Declara el formato Showplan y la versión utilizada para describir el documento.

  2. 2
    BatchSequence

    Agrupa los lotes incluidos en el plan. Un lote es el conjunto de instrucciones enviado conjuntamente a SQL Server.

  3. 3
    Statements

    Contiene las instrucciones compiladas dentro del lote. Cada instrucción conserva sus propios datos y su plan.

  4. 4
    QueryPlan

    Reúne el árbol, la información de compilación, memoria, estadísticas utilizadas y otros datos que corresponden al plan de esa instrucción.

La jerarquía se lee de afuera hacia adentro:

ShowPlanXML
└── BatchSequence
    └── Batch
        └── Statements
            └── StmtSimple
                └── QueryPlan
                    └── RelOp

No todos los planes tienen una sola instrucción ni un solo operador. Un lote puede contener varias instrucciones y cada árbol puede anidar tantos RelOp como requiera la estrategia elegida.

El elemento RelOp se observa con mayor detalle en la captura dedicada al operador, más adelante en esta entrada.

StmtSimple identifica la instrucción compilada

StmtSimple conserva datos de una instrucción individual. En la captura aparecen, entre otros:

  • StatementText: el texto enviado a SQL Server;
  • StatementEstRows: las filas estimadas para la salida de la instrucción;
  • StatementSubTreeCost: el costo estimado del árbol completo;
  • StatementOptmLevel: el nivel de optimización aplicado;
  • QueryHash y QueryPlanHash: identificadores calculados que ayudan a agrupar consultas o planes comparables.

Un hash es un valor calculado a partir de otra información. Sirve como identificador práctico para comparar o agrupar, pero no sustituye el texto, el contexto ni las métricas del plan.

StatementText puede incluir nombres de objetos, literales y parámetros. Por eso un archivo .sqlplan debe revisarse antes de compartirse, aunque solamente vayamos a estudiar su estructura.

NodeId relaciona el operador con sus propiedades

Al seleccionar un nodo del plan gráfico, el panel Properties expone los valores del operador:

Node ID y operaciones lógica y física en Properties

  1. 1
    Node ID

    Identifica el nodo dentro de este plan. El valor permite localizar el mismo operador en el XML.

  2. 2
    Operación lógica

    Describe la tarea relacional solicitada, como localizar filas mediante un índice.

  3. 3
    Operación física

    Indica el algoritmo utilizado por SQL Server para realizar esa tarea.

El identificador pertenece al documento abierto. No debe tratarse como un número permanente de la consulta: otra compilación puede producir un árbol distinto y asignar otros identificadores.

RelOp reúne la identidad y las estimaciones del nodo

Atributos y lista de salida de un elemento RelOp

  1. 1
    Elemento RelOp

    La etiqueta de apertura reúne estimaciones de filas, CPU, entrada y salida, ejecuciones y costo del subárbol.

  2. 2
    Identidad del operador

    LogicalOp, NodeId y PhysicalOp permiten reconocer qué tarea representa el nodo y cómo se implementa.

  3. 3
    OutputList

    Enumera las columnas que el operador entrega a su consumidor. No representa todas las columnas disponibles en el objeto leído.

Dentro de RelOp aparecen elementos específicos del operador. En este caso, IndexScan describe el acceso al índice aunque la operación física visible sea Clustered Index Seek; sus elementos hijos conservan el objeto, las columnas definidas y el predicado utilizado para localizar el intervalo.

El plan real agrega métricas observadas

RunTimeInformation y RunTimeCountersPerThread en un plan real

  1. 1
    RunTimeInformation

    Agrupa la evidencia producida durante la ejecución. Este elemento no aparece en el plan estimado de la misma consulta.

  2. 2
    RunTimeCountersPerThread

    Conserva filas observadas, ejecuciones, lecturas y tiempos para un trabajador. Un operador paralelo puede incluir más de una entrada.

En esta ejecución, ActualRows="101" indica que el operador entregó 101 filas y ActualRowsRead="101" que leyó 101. Esos valores describen esta ejecución concreta. No demuestran por sí solos que la consulta mantendrá el mismo comportamiento con otros parámetros, datos o condiciones de carga.

Un trabajador es el contexto que ejecuta una parte del plan. En un plan serial suele aparecer una sola entrada con Thread="0"; en un plan paralelo puede haber varias, y el total del operador debe entenderse a partir del conjunto.

Algunos elementos solamente aparecen cuando existe la condición

El XML puede incluir Warnings, parámetros compilados y ejecutados, concesiones de memoria, sugerencias MissingIndex y otras secciones. Su ausencia también es información: significa que ese documento no registró esa condición, no que la condición sea imposible en cualquier ejecución.

No agregamos esos elementos a esta consulta para completar una lista. Las advertencias se estudian con planes que realmente las producen; las sugerencias de índices y sus límites se revisan más adelante con una prueba preparada para ese propósito.

Qué podemos concluir

Podemos recorrer el XML desde la instrucción hasta un operador, relacionar NodeId con el panel Properties y distinguir las estimaciones de las métricas que solamente aporta un plan real.

No necesitamos memorizar todo el esquema Showplan. La lectura empieza con una pregunta concreta: localizar una instrucción, un nodo, una propiedad o una diferencia entre lo estimado y lo observado.

Siguiente comprobación razonable

La siguiente entrada recorre Analyze Actual Execution Plan: cómo seleccionar una instrucción, leer sus escenarios y conservar cada propuesta como hipótesis pendiente de comprobación.

Relacionado con

Índice del recorrido

Planes de ejecución

30 artículos de Planes de ejecución
  1. 01Para qué sirve un plan de ejecución
  2. 02Plan estimado, plan real y estadísticas en vivo
  3. 03Cómo se organiza el árbol de un plan de ejecución
  4. 04Flechas, propiedades y número de ejecuciones
  5. 05Mapa de operadores: qué papel cumple cada nodo
  6. 06Filas estimadas y filas reales
  7. 07Index Seek, Index Scan y Table Scan
  8. 08Key Lookup y trabajo repetido
  9. 09Filter, Compute Scalar y Top
  10. 10Nested Loops, Hash Match y Merge Join
  11. 11Sort, Segment y Sequence Project
  12. 12Stream Aggregate y Hash Match (Aggregate)
  13. 13Spool: materialización y reutilización
  14. 14Parallelism: distribuir, repartir y reunir filas
  15. 15Advertencias del plan que requieren investigación
  16. 16Acciones disponibles en el plan gráfico de SSMS
  17. 17Cómo se organiza el XML Showplan
  18. 18Recorrer Analyze Actual Execution Plan
  19. 19Lecturas con SET STATISTICS IO
  20. 20CPU y duración con SET STATISTICS TIME
  21. 21Construir una línea base repetible
  22. 22Guardar y comparar dos planes
  23. 23Historial y regresiones con Query Store
  24. 24Convertir un escenario de Analyze Actual Execution Plan en una hipótesis
  25. 25Leer una sugerencia Missing Index en el plan
  26. 26Entender el CREATE INDEX generado por SSMS
  27. 27Decidir, crear y comprobar un índice
  28. 28De una consulta lenta a una hipótesis comprobable
  29. 29Evaluar un cambio sin optimizar solo una ejecución
  30. 30Análisis guiado de una consulta empresarial reproducible