Interpretando o Showplan XML do SQL Server

15

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="&#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>

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!

Jake Feasel
fonte

Respostas:

9

Primeiro, deixe-me dizer - site com aparência fantástica :)

Esse tipo de coisa é exatamente o que escrevi para o XSLT - fico feliz que os outros estejam achando útil!

Eu tenho que confessar algo que escrevi há um tempo atrás e depois fiquei meio fora de controle, há algumas melhorias que planejo fazer há algum tempo agora que espero poder implementar em breve!

Alguns links:

Deixe-me saber se você tem alguma sugestão de melhorias!

Justin
fonte