解释 SQL Server 的 Showplan XML

Jak*_*sel 15 sql-server execution-plan sql-server-2008-r2

我刚刚在我的网站http://sqlfiddle.com上推出了一项功能,允许用户查看其查询的原始执行计划。对于 PostgreSQL、MySQL 和(在某种程度上)Oracle,查看原始执行计划输出似乎很容易理解。但是,如果您查看 SQL Server 的执行计划输出(使用 生成SET SHOWPLAN_XML ON),即使对于相对简单的查询,也有大量的 XML 需要处理。这是一个示例(取自此“小提琴”的最后一个查询的执行计划: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>
Run Code Online (Sandbox Code Playgroud)

我使用这个函数的目标是为用户提供一些有意义的东西来分析他们的查询性能(比如,与其他可能的查询实现方法进行比较)。但是,我现在担心我向用户提供了太多数据。我需要找到一种方法来使它有用。

我的一个想法是建立一个简单的机制来将输出下载为 .sqlplan 文件,这样他们就可以用 SSMS 打开它并在那里以图形方式查看它。不过,如果有其他合理的选择,我宁愿不必依赖拥有此类外部工具的用户。

我的另一个想法是使用某种 XSLT 转换,它可以提取并很好地呈现最重要的部分。然而,这听起来像是大量的工作,而且似乎没有任何关于我将如何开始的好的文档。有谁知道使用此模式的现有 XSLT 模板?

还有其他想法吗?

更新

好的,我只是在http://data.stackexchange.com/上查看了“执行计划”选项卡以进行查询。我怎么得到它?!太棒了!我希望这不是他们内部构建的仅限内部到堆栈交换的库。有人知道吗?

更新 2

我刚刚使用这个项目中的 XSLT 推出了令人敬畏的 HTML+CSS+JS 显示计划 XML 视图:http : //code.google.com/p/html-query-plan/(你现在可以看到它,如果您访问上面的原始链接)。

我会等着看这个项目的作者(https://dba.stackexchange.com/users/5996/justin)是否出现回答这个问题,所以我可以给他应有的荣誉。如果一段时间后我没有看到他出现,那么我会很高兴地将功劳归功于马丁,或者,即使失败了,我也会自己回答。谢谢贾斯汀和马丁!

Jus*_*tin 9

首先让我说 - 看起来很棒的网站:)

这类东西正是我编写 XSLT 的目的——我很高兴其他人发现它很有用!

我不得不承认它是我前一段时间写的,然后有点偏离轨道,我已经计划进行一段时间的一些改进,我希望能够尽快实际实施!

一些链接:

如果您有任何改进建议,请告诉我!