Interpretation von SQL Server Showplan XML

15

Ich habe gerade eine Funktion auf meiner Website http://sqlfiddle.com eingeführt , mit der Benutzer die unformatierten Ausführungspläne für ihre Abfragen anzeigen können. Im Fall von PostgreSQL, MySQL und (in gewissem Maße) Oracle erscheint es nachvollziehbar, die Ausgabe des unformatierten Ausführungsplans zu betrachten. Wenn Sie sich jedoch die Ausgabe des Ausführungsplans für SQL Server (generiert mit SET SHOWPLAN_XML ON) ansehen , müssen Sie selbst bei relativ einfachen Abfragen eine gewaltige Menge an XML durchgehen. Hier ist ein Beispiel (entnommen aus dem Ausführungsplan der letzten Abfrage für diese 'Geige': 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>

Mein Ziel mit dieser Funktion war es, dem Benutzer etwas zur Verfügung zu stellen, das für die Analyse seiner Abfrageleistung von Bedeutung ist (zum Beispiel um einen Vergleich mit anderen möglichen Ansätzen zur Implementierung von Abfragen anzustellen). Jetzt bin ich jedoch besorgt, dass ich dem Benutzer ZU VIEL Daten zur Verfügung stelle. Ich muss einen Weg finden, dies nützlich zu machen.

Ich hatte die Idee, einen einfachen Mechanismus zum Herunterladen der Ausgabe als .sqlplan-Datei zu erstellen, damit sie mit SSMS geöffnet und dort grafisch angezeigt werden kann. Ich möchte mich jedoch nicht darauf verlassen müssen, dass Benutzer solche externen Tools zur Verfügung haben, wenn eine andere vernünftige Option verfügbar ist.

Eine andere Idee, die ich hatte, war die Verwendung einer Art XSLT-Transformation, die die wichtigsten Elemente herausziehen und schön präsentieren konnte. Das klingt nach einer Menge Arbeit, und es scheint keine gute Dokumentation zu geben, wie ich überhaupt damit anfangen würde. Kennt jemand vorhandene XSLT-Vorlagen, die mit diesem Schema funktionieren?

Irgendwelche anderen Gedanken?

Aktualisieren

Okay, ich habe gerade auf der Registerkarte "Ausführungsplan" nach einer Abfrage unter http://data.stackexchange.com/ gesucht . Wie kriege ich das hin ?! Das ist genial! Ich hoffe, dass es sich nicht um eine interne Bibliothek handelt, die nur für den Stapelaustausch gedacht ist und die sie selbst erstellt haben. Weiß jemand?

Update 2

Ich habe gerade die fantastische HTML + CSS + JS-Ansicht des Showplan-XML mit dem XSLT aus diesem Projekt eingeführt: http://code.google.com/p/html-query-plan/ (Sie können es jetzt sehen, wenn Sie besuchen den ursprünglichen Link (siehe oben).

Ich werde abwarten, ob der Autor dieses Projekts ( /dba//users/5996/justin ) auftaucht, um diese Frage zu beantworten, damit ich ihm seine gebührende Anerkennung aussprechen kann. Wenn ich ihn nach einer Weile nicht sehen kann, gebe ich Martin gerne die Ehre, oder, falls das nicht gelingt, beantworte ich es einfach selbst. Danke Justin und Martin!

Jake Feasel
quelle

Antworten:

9

Lassen Sie mich zuerst sagen - fantastisch aussehende Seite :)

Genau dafür habe ich XSLT geschrieben - ich bin froh, dass andere es nützlich finden!

Ich muss etwas konkretisieren, das ich vor einiger Zeit geschrieben habe und das dann irgendwie verfälscht wurde. Es gibt einige Verbesserungen, die ich schon seit einiger Zeit vorhabe, und die ich hoffe, bald tatsächlich umsetzen zu können!

Einige Links:

Lassen Sie mich wissen, wenn Sie Verbesserungsvorschläge haben!

Justin
quelle