サイト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>
この関数の私の目標は、ユーザーにクエリパフォーマンスの分析に意味のあるものを提供することでした(たとえば、他の可能なクエリ実装アプローチと比較する)。しかし、私はユーザーに非常に多くのデータを提供していることを心配しています。これを便利にする方法を見つける必要があります。
私が持っていたアイデアの1つは、出力を.sqlplanファイルとしてダウンロードするための簡単なメカニズムを構築し、SSMSでそれを開いてグラフィカルに表示できるようにすることでした。ただし、利用可能な別の合理的なオプションがあれば、そのような外部ツールを利用できるユーザーに頼る必要はありません。
私が持っていた別のアイデアは、最も重要な部分を引き出してうまく表示できる、ある種のXSLT変換を使用することでした。しかし、これは膨大な作業のように聞こえますが、どのようにそれを開始するかについての良いドキュメントはないようです。このスキーマで動作する既存のXSLTテンプレートを知っていますか?
他に考えはありますか?
更新
さて、http://data.stackexchange.com/のクエリの「実行計画」タブを見てみました。どうやって手に入れますか?!すごいです!彼らが社内で構築した、内部からスタック交換専用のライブラリではないことを願っています。知ってる?
更新2
このプロジェクトのXSLTを使用して、showplan XMLの素晴らしいHTML + CSS + JSビューを公開しました:http : //code.google.com/p/html-query-plan/(今すぐ見ることができます上記の元のリンクにアクセスします)。
私はこのプロジェクトの著者(/dba//users/5996/justin)がこの質問に答えるのを待っているので、彼に適切なクレジットを与えることができます。しばらくして彼が現れない場合は、喜んでマーティンにクレジットを与えるか、失敗しても自分で答えます。ジャスティンとマーティンに感謝します!