Interpretazione dell'XML Showplan di SQL Server


15

Ho appena implementato una funzione sul mio sito http://sqlfiddle.com che consente agli utenti di visualizzare i piani di esecuzione non elaborati per le loro query. Nel caso di PostgreSQL, MySQL e (in una certa misura) Oracle, l'output del piano di esecuzione non elaborato appare comprensibile. Tuttavia, se si guarda all'output del piano di esecuzione per SQL Server (generato con SET SHOWPLAN_XML ON), c'è una quantità enorme di XML da superare, anche per query relativamente semplici. Ecco un esempio (tratto dal piano di esecuzione dell'ultima query per questo 'violino': 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>

Il mio obiettivo con questa funzione era fornire all'utente qualcosa di significativo per l'analisi delle prestazioni della query (diciamo, per confrontare con altri possibili approcci di implementazione della query). Tuttavia, ora sono preoccupato che sto fornendo troppi dati all'utente. Devo trovare un modo per renderlo utile.

Un'idea che avevo era quella di creare un meccanismo semplice per scaricare l'output come file .sqlplan, in modo che potessero aprirlo con SSMS e guardarlo graficamente lì. Preferirei non dover fare affidamento sul fatto che gli utenti dispongano di tali strumenti esterni disponibili, se è disponibile un'altra opzione ragionevole.

Un'altra idea che avevo era usare una sorta di trasformazione XSLT che potesse estrarre e presentare in modo gradevole i bit più importanti. Questo suona come un sacco di lavoro, tuttavia, e non sembra esserci alcuna buona documentazione su come vorrei nemmeno iniziare. Qualcuno sa dei modelli XSLT esistenti che funzionano con questo schema?

Qualche altro pensiero?

Aggiornare

Ok, ho appena dato un'occhiata alla scheda "Piano di esecuzione" per una query su http://data.stackexchange.com/ . Come lo capisco ?! Questo è impressionante! Spero che questa non sia una libreria interna per stackexchange che hanno costruito internamente. Qualcuno sa?

Aggiornamento 2

Ho appena lanciato la fantastica vista HTML + CSS + JS dello showplan XML usando l'XSLT di questo progetto: http://code.google.com/p/html-query-plan/ (puoi vederlo ora se visiti il ​​link originale sopra).

Aspetterò e vedrò se l'autore di questo progetto ( /dba//users/5996/justin ) si presenta per rispondere a questa domanda, così posso dargli il dovuto credito. Se non lo vedo entrare dopo un po ', allora darò felicemente il merito a Martin o, in mancanza anche, risponderò da solo. Grazie Justin e Martin!

Risposte:


9

Prima di tutto lasciatemi dire - sito dall'aspetto fantastico :)

Questo genere di cose è esattamente quello per cui ho scritto XSLT: sono contento che gli altri lo trovino utile!

Devo confessare che è qualcosa che ho scritto qualche tempo fa e poi ho avuto una sorta di tracciamento laterale, ci sono alcuni miglioramenti che ho pianificato di apportare da un po 'ora che spero di riuscire a implementare presto!

Alcuni link:

Fammi sapere se hai suggerimenti per miglioramenti!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.