Interpretación del XML del plan de presentación de SQL Server

15

Acabo de implementar una función en mi sitio http://sqlfiddle.com que permite a los usuarios ver los planes de ejecución sin procesar de sus consultas. En el caso de PostgreSQL, MySQL y (en cierta medida) Oracle, mirar el resultado del plan de ejecución sin procesar parece comprensible. Sin embargo, si observa la salida del plan de ejecución para SQL Server (generada con SET SHOWPLAN_XML ON), hay una cantidad masiva de XML para atravesar, incluso para consultas relativamente simples. Aquí hay un ejemplo (tomado del plan de ejecución de la última consulta para este 'violín': http://sqlfiddle.com/#!3/1fa93/1 ):

<ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.1" Build="10.50.2500.0">
    <BatchSequence>
        <Batch>
            <Statements>
                <StmtSimple StatementText="&#xa;select * from supportContacts" StatementId="1" StatementCompId="1" StatementType="SELECT" StatementSubTreeCost="0.0032853" StatementEstRows="3" StatementOptmLevel="TRIVIAL" QueryHash="0x498D13A3874D9B6E" QueryPlanHash="0xD5DDBD3C2D195E96">
                    <StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="false" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false"/>
                    <QueryPlan CachedPlanSize="16" CompileTime="0" CompileCPU="0" CompileMemory="72">
                        <RelOp NodeId="0" PhysicalOp="Clustered Index Scan" LogicalOp="Clustered Index Scan" EstimateRows="3" EstimateIO="0.003125" EstimateCPU="0.0001603" AvgRowSize="42" EstimatedTotalSubtreeCost="0.0032853" TableCardinality="3" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
                            <OutputList>
                                <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="id"/>
                                <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="type"/>
                                <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="details"/>
                            </OutputList>
                            <IndexScan Ordered="0" ForcedIndex="0" ForceScan="0" NoExpandHint="0">
                                <DefinedValues>
                                    <DefinedValue>
                                        <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="id"/>
                                    </DefinedValue>
                                    <DefinedValue>
                                        <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="type"/>
                                    </DefinedValue>
                                    <DefinedValue>
                                        <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="details"/>
                                    </DefinedValue>
                                </DefinedValues>
                                <Object Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Index="[PK__supportC__3213E83F7F60ED59]" IndexKind="Clustered"/>
                            </IndexScan>
                        </RelOp>
                    </QueryPlan>
                </StmtSimple>
            </Statements>
        </Batch>
    </BatchSequence>
</ShowPlanXML>

Mi objetivo con esta función era proporcionar al usuario algo significativo para el análisis del rendimiento de su consulta (por ejemplo, para compararlo con otros posibles enfoques de implementación de consultas). Sin embargo, ahora me preocupa que estoy proporcionando demasiados datos al usuario. Necesito encontrar una manera de hacer esto útil.

Una idea que tuve fue crear un mecanismo fácil para descargar la salida como un archivo .sqlplan, para que pudieran abrirlo con SSMS y verlo gráficamente allí. Sin embargo, preferiría no tener que depender de que los usuarios tengan tales herramientas externas disponibles si hay otra opción razonable disponible.

Otra idea que tuve fue usar algún tipo de transformación XSLT que pudiera extraer y presentar muy bien los bits más importantes. Sin embargo, esto suena como un montón de trabajo, y no parece haber ninguna buena documentación sobre cómo incluso comenzaría eso. ¿Alguien sabe de las plantillas XSLT existentes que funcionan con este esquema?

¿Alguna otra idea?

Actualizar

Bien, acabo de echar un vistazo a la pestaña "Plan de ejecución" para una consulta en http://data.stackexchange.com/ . ¿Cómo consigo eso? Eso es asombroso! Espero que no sea una biblioteca interna de intercambio de pila que construyeron internamente. ¿Nadie sabe?

Actualización 2

Acabo de desplegar la increíble vista HTML + CSS + JS del showplan XML usando el XSLT de este proyecto: http://code.google.com/p/html-query-plan/ (puede verlo ahora si visita el enlace original, arriba).

Esperaré y veré si el autor de este proyecto ( /dba//users/5996/justin ) aparece para responder esta pregunta, de modo que pueda darle el debido crédito. Si no lo veo aparecer después de un tiempo, entonces felizmente le daré el crédito a Martin o, incluso si falla, lo responderé yo mismo. ¡Gracias Justin y Martin!

Jake Feasel
fuente

Respuestas:

9

Primero déjame decirte: sitio de aspecto fantástico :)

Este tipo de cosas es exactamente para lo que escribí ese XSLT: ¡me alegra que otros lo encuentren útil!

Tengo que confesar que es algo que escribí hace un tiempo y luego me desvié, ¡hay algunas mejoras que he estado planeando hacer por un tiempo ahora que espero implementar pronto!

Algunos enlaces:

¡Avíseme si tiene alguna sugerencia para mejorar!

Justin
fuente