Interprétation du XML Showplan de SQL Server

15

Je viens de déployer une fonctionnalité sur mon site http://sqlfiddle.com qui permet aux utilisateurs de visualiser les plans d'exécution bruts de leurs requêtes. Dans le cas de PostgreSQL, MySQL et (dans une certaine mesure) Oracle, regarder la sortie du plan d'exécution brut semble compréhensible. Cependant, si vous regardez la sortie du plan d'exécution pour SQL Server (généré avec SET SHOWPLAN_XML ON), il y a une quantité simplement énorme de XML à parcourir, même pour des requêtes relativement simples. Voici un exemple (tiré du plan d'exécution de la dernière requête pour ce 'violon': 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>

Mon objectif avec cette fonction était de fournir à l'utilisateur quelque chose de significatif pour l'analyse des performances de sa requête (par exemple, pour comparer avec d'autres approches d'implémentation de requête possibles). Cependant, je crains maintenant de fournir TROP BEAUCOUP de données à l'utilisateur. Je dois trouver un moyen de rendre cela utile.

Une idée que j'ai eue était de construire un mécanisme simple pour télécharger la sortie sous forme de fichier .sqlplan, afin qu'ils puissent l'ouvrir avec SSMS et le regarder graphiquement là-bas. Je préfère ne pas avoir à compter sur les utilisateurs disposant de tels outils externes, cependant, s'il existe une autre option raisonnable disponible.

Une autre idée que j'avais était d'utiliser une sorte de transformation XSLT qui pourrait extraire et présenter joliment les bits les plus importants. Cela ressemble à une tonne de travail, cependant, et il ne semble pas y avoir de bonne documentation sur la façon même de commencer. Quelqu'un connaît-il des modèles XSLT existants qui fonctionnent avec ce schéma?

D'autres réflexions?

Mise à jour

D'accord, je viens de jeter un œil à l'onglet "Plan d'exécution" pour une requête sur http://data.stackexchange.com/ . Comment puis-je obtenir ça?! C'est génial! J'espère que ce n'est pas une bibliothèque interne à stackexchange uniquement qu'ils ont construite en interne. Quelqu'un sait?

Update 2

Je viens de déployer la superbe vue HTML + CSS + JS du showplan XML en utilisant le XSLT de ce projet: http://code.google.com/p/html-query-plan/ (vous pouvez le voir maintenant si vous visitez le lien d'origine, ci-dessus).

J'attendrai et voir si l'auteur de ce projet ( /dba//users/5996/justin ) se présente pour répondre à cette question, afin que je puisse lui donner le crédit qui lui revient. Si je ne le vois pas apparaître après un certain temps, alors je donnerai volontiers le crédit à Martin ou, à défaut, je répondrai moi-même. Merci Justin et Martin!

Jake Feasel
la source

Réponses:

9

Tout d'abord, permettez-moi de dire - un site fantastique :)

Ce genre de chose est exactement ce que j'ai écrit pour XSLT - je suis heureux que d'autres trouvent cela utile!

Je dois avouer que c'est quelque chose que j'ai écrit il y a un certain temps et que j'ai ensuite été mis à l'écart, il y a quelques améliorations que je prévois d'apporter depuis un certain temps maintenant que j'espère pouvoir bientôt mettre en œuvre!

Quelques liens:

Faites-moi savoir si vous avez des suggestions d'amélioration!

Justin
la source