我刚刚在网站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="
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,或者即使失败了,我也要自己回答。谢谢贾斯汀和马丁!