解释SQL Server的Showplan XML


15

我刚刚在网站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>

我使用此功能的目标是为用户提供一些有意义的信息,以分析其查询性能(例如,与其他可能的查询实现方法进行比较)。但是,现在我担心会向用户提供太多数据。我需要找到一种使之有用的方法。

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

我的另一个想法是使用某种XSLT转换,该转换可以提取并很好地呈现最重要的位。不过,这听起来像是花了很多功夫,而且似乎没有关于如何开始的良好文档。有人知道使用此模式的现有XSLT模板吗?

还有其他想法吗?

更新资料

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

更新2

我刚刚从该项目中使用XSLT推出了展示计划XML的出色HTML + CSS + JS视图:http : //code.google.com/p/html-query-plan/(如果您现在可以看到它,您访问上方的原始链接)。

我将拭目以待,看看该项目的作者(/dba//users/5996/justin)是否能回答这个问题,所以我可以给他适当的信誉。如果一段时间后我没有看到他突然出现,那么我会很高兴地将功劳归功于Martin,或者即使失败了,我也要自己回答。谢谢贾斯汀和马丁!

Answers:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.