Acabei de lançar um recurso no meu site http://sqlfiddle.com que permite aos usuários visualizar os planos de execução brutos para suas consultas. No caso do PostgreSQL, MySQL e (até certo ponto) Oracle, analisar a saída bruta do plano de execução parece compreensível. No entanto, se você observar a saída do plano de execução para o SQL Server (gerado com SET SHOWPLAN_XML ON
), há uma quantidade enorme de XML a ser analisada, mesmo para consultas relativamente simples. Aqui está um exemplo (retirado do plano de execução da última consulta para este 'violino': 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>
Meu objetivo com essa função era fornecer ao usuário algo significativo para a análise do desempenho de suas consultas (por exemplo, comparar com outras abordagens possíveis de implementação de consultas). No entanto, agora estou preocupado que estou fornecendo MUITOS dados ao usuário. Preciso encontrar uma maneira de tornar isso útil.
Uma idéia que tive foi criar um mecanismo fácil para baixar a saída como um arquivo .sqlplan, para que eles pudessem abri-lo com o SSMS e ver graficamente lá. Eu prefiro não ter que confiar nos usuários que têm essas ferramentas externas disponíveis, se houver outra opção razoável disponível.
Outra idéia que tive foi usar algum tipo de transformação XSLT que pudesse extrair e apresentar com agrado os bits mais importantes. Isso soa como uma tonelada de trabalho, e não parece haver nenhuma boa documentação sobre como eu começaria isso. Alguém sabe de modelos XSLT existentes que funcionam com esse esquema?
Algum outro pensamento?
Atualizar
Ok, acabei de dar uma olhada na guia "Plano de execução" para uma consulta em http://data.stackexchange.com/ . Como faço para conseguir isso ?! Isso é incrível! Espero que não seja uma biblioteca apenas de troca interna para a pilha que eles construíram internamente. Ninguem sabe?
Atualização 2
Acabei de lançar a incrível visualização HTML + CSS + JS do XML do plano de show usando o XSLT deste projeto: http://code.google.com/p/html-query-plan/ (você pode ver agora se você acessa o link original acima).
Vou aguardar e ver se o autor deste projeto ( /dba//users/5996/justin ) aparece para responder a essa pergunta, para que eu possa lhe dar o devido crédito. Se não o vir aparecer depois de um tempo, darei o crédito de bom grado a Martin ou, na sua falta, responderei pessoalmente. Obrigado Justin e Martin!