Menafsirkan Showplan XML SQL Server

15

Saya baru saja meluncurkan fitur di situs saya http://sqlfiddle.com yang memungkinkan pengguna untuk melihat rencana eksekusi mentah untuk pertanyaan mereka. Dalam kasus PostgreSQL, MySQL, dan (sampai batas tertentu) Oracle, melihat output rencana eksekusi yang mentah tampak dapat dipahami. Namun, jika Anda melihat output rencana pelaksanaan untuk SQL Server (dihasilkan dengan SET SHOWPLAN_XML ON), ada sejumlah besar XML untuk mengarungi, bahkan untuk permintaan yang relatif sederhana. Berikut ini sebuah contoh (diambil dari rencana eksekusi permintaan terakhir untuk 'biola' ini: 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>

Tujuan saya dengan fungsi ini adalah untuk memberi pengguna sesuatu yang bermakna untuk analisis kinerja kueri mereka (katakanlah, untuk membandingkan terhadap kemungkinan pendekatan penerapan kueri lainnya). Namun, saya sekarang khawatir bahwa saya memberikan TERLALU BANYAK data kepada pengguna. Saya perlu menemukan cara untuk membuat ini bermanfaat.

Satu ide yang saya miliki adalah membangun mekanisme yang mudah untuk mengunduh output sebagai file .sqlplan, sehingga mereka dapat membukanya dengan SSMS dan melihatnya secara grafik di sana. Saya lebih suka tidak harus bergantung pada pengguna yang memiliki alat eksternal yang tersedia, meskipun, jika ada pilihan lain yang masuk akal tersedia.

Gagasan lain yang saya miliki adalah menggunakan semacam transformasi XSLT yang dapat menarik dan menyajikan bit yang paling penting. Ini kedengarannya seperti pekerjaan yang berat, dan sepertinya tidak ada dokumentasi yang bagus tentang bagaimana saya akan memulai itu. Adakah yang tahu tentang template XSLT yang ada yang berfungsi dengan skema ini?

Ada pemikiran lain?

Memperbarui

Oke, saya baru saja melihat pada tab "Rencana Eksekusi" untuk permintaan di http://data.stackexchange.com/ . Bagaimana saya mendapatkannya? Itu mengagumkan! Saya berharap itu bukan perpustakaan internal-ke-stackexchange-saja yang mereka bangun di rumah. Adakah yang tahu

Perbarui 2

Saya baru saja meluncurkan tampilan HTML + CSS + JS yang mengagumkan dari showplan XML menggunakan XSLT dari proyek ini: http://code.google.com/p/html-query-plan/ (Anda dapat melihatnya sekarang jika Anda mengunjungi tautan asli, di atas).

Saya akan menunggu dan melihat apakah penulis proyek ini ( /dba//users/5996/justin ) muncul untuk menjawab pertanyaan ini, sehingga saya dapat memberinya kredit yang pantas. Jika saya tidak melihat dia muncul setelah beberapa saat, maka saya akan dengan senang hati memberikan kredit kepada Martin atau, bahkan gagal, saya hanya akan menjawabnya sendiri. Justin dan Martin terima kasih!

Jake Feasel
sumber

Jawaban:

9

Pertama izinkan saya katakan saja - situs tampak fantastis :)

Hal seperti ini persis seperti yang saya tulis untuk XSLT - Saya senang orang lain menganggapnya berguna!

Saya harus mengatakan sesuatu yang saya tulis beberapa waktu lalu dan kemudian mendapatkan semacam pelacak, ada beberapa perbaikan yang telah saya rencanakan untuk sementara waktu sekarang saya berharap untuk berkeliling untuk benar-benar menerapkan segera!

Beberapa tautan:

Beri tahu saya jika Anda memiliki saran untuk perbaikan!

Justin
sumber