No Microsoft SQL Server, como posso obter um plano de execução de uma consulta / procedimento armazenado?
338
No Microsoft SQL Server, como posso obter um plano de execução de uma consulta / procedimento armazenado?
Respostas:
Existem vários métodos para obter um plano de execução, o qual usar dependerá de suas circunstâncias. Geralmente, você pode usar o SQL Server Management Studio para obter um plano; no entanto, se por algum motivo não puder executar sua consulta no SQL Server Management Studio, poderá ser útil obter um plano via SQL Server Profiler ou inspecionando o cache do plano.
Método 1 - usando o SQL Server Management Studio
O SQL Server vem com alguns recursos interessantes que facilitam a captura de um plano de execução, basta verificar se o item de menu "Incluir Plano de Execução Real" (encontrado no menu "Consulta") está marcado e executar sua consulta normalmente. .
Se você estiver tentando obter o plano de execução para instruções em um procedimento armazenado, execute o procedimento armazenado, da seguinte maneira:
Quando sua consulta for concluída, você verá uma guia extra intitulada "Plano de execução" no painel de resultados. Se você executou muitas instruções, poderá ver muitos planos exibidos nesta guia.
Aqui, você pode inspecionar o plano de execução no SQL Server Management Studio ou clicar com o botão direito do mouse no plano e selecionar "Salvar plano de execução como ..." para salvar o plano em um arquivo no formato XML.
Método 2 - Usando as opções SHOWPLAN
Esse método é muito semelhante ao método 1 (de fato, é o que o SQL Server Management Studio faz internamente); no entanto, eu o incluí por completo ou se você não possui o SQL Server Management Studio disponível.
Antes de executar sua consulta, execute uma das seguintes instruções. A instrução deve ser a única instrução do lote, ou seja, você não pode executar outra instrução ao mesmo tempo:
Essas são opções de conexão e, portanto, você só precisa executá-la uma vez por conexão. A partir desse ponto, todas as instruções executadas serão acompanhadas por um conjunto de resultados adicional contendo seu plano de execução no formato desejado - basta executar sua consulta como faria normalmente para ver o plano.
Quando terminar, você pode desativar esta opção com a seguinte instrução:
Comparação de formatos de plano de execução
A menos que você tenha uma forte preferência, minha recomendação é usar a
STATISTICS XML
opção Essa opção é equivalente à opção "Incluir plano de execução real" no SQL Server Management Studio e fornece mais informações no formato mais conveniente.SHOWPLAN_TEXT
- Exibe um plano de execução estimado baseado em texto básico, sem executar a consultaSHOWPLAN_ALL
- Exibe um plano de execução estimado baseado em texto com estimativas de custo, sem executar a consultaSHOWPLAN_XML
- Exibe um plano de execução estimado baseado em XML com estimativas de custo, sem executar a consulta. Isso é equivalente à opção "Exibir plano de execução estimado ..." no SQL Server Management Studio.STATISTICS PROFILE
- Executa a consulta e exibe um plano de execução real baseado em texto.STATISTICS XML
- Executa a consulta e exibe um plano de execução real baseado em XML. Isso é equivalente à opção "Incluir plano de execução real" no SQL Server Management Studio.Método 3 - usando o SQL Server Profiler
Se você não puder executar sua consulta diretamente (ou sua consulta não for lenta lentamente quando executada diretamente - lembre-se de que queremos que um plano da consulta tenha um desempenho ruim), você poderá capturar um plano usando um rastreamento do SQL Server Profiler. A idéia é executar sua consulta enquanto um rastreamento que está capturando um dos eventos "Showplan" está em execução.
Observe que, dependendo da carga, você pode usar esse método em um ambiente de produção, no entanto, obviamente, você deve ter cuidado. Os mecanismos de perfis SQL Server são projetados para minimizar o impacto sobre o banco de dados, mas isso não significa que não haverá qualquer impacto no desempenho. Você também pode ter problemas para filtrar e identificar o plano correto em seu rastreio, se o banco de dados estiver sob uso intenso. Obviamente, você deve verificar com seu DBA para ver se eles estão felizes com você fazendo isso em seu precioso banco de dados!
O plano que você obtém é equivalente à opção "Incluir plano de execução real" no SQL Server Management Studio.
Método 4 - Inspecionando o cache da consulta
Se você não puder executar sua consulta diretamente e também não conseguir capturar um rastreamento do criador de perfil, ainda poderá obter um plano estimado inspecionando o cache do plano de consulta SQL.
Inspecionamos o cache do plano consultando as DMVs do SQL Server . A seguir, é apresentada uma consulta básica que lista todos os planos de consulta em cache (como xml) junto com o texto SQL. Na maioria dos bancos de dados, você também precisará adicionar cláusulas de filtragem adicionais para filtrar os resultados apenas nos planos nos quais está interessado.
Execute esta consulta e clique no XML do plano para abrir o plano em uma nova janela - clique com o botão direito do mouse e selecione "Salvar plano de execução como ..." para salvar o plano em arquivo no formato XML.
Notas:
Como existem muitos fatores envolvidos (desde o esquema da tabela e do índice até os dados armazenados e as estatísticas da tabela), você deve sempre tentar obter um plano de execução do banco de dados em que está interessado (normalmente aquele que está apresentando desempenho) problema).
Você não pode capturar um plano de execução para procedimentos armazenados criptografados.
planos de execução "reais" vs "estimados"
Um plano de execução real é aquele em que o SQL Server realmente executa a consulta, enquanto um plano de execução estimado do SQL Server executa o que ele faria sem executar a consulta. Embora logicamente equivalente, um plano de execução real é muito mais útil, pois contém detalhes e estatísticas adicionais sobre o que realmente aconteceu ao executar a consulta. Isso é essencial ao diagnosticar problemas em que as estimativas dos Servidores SQL estão desativadas (como quando as estatísticas estão desatualizadas).
Como interpreto um plano de execução de consulta?
Esse é um tópico digno o suficiente para um livro (gratuito) por si só.
Veja também:
fonte
SET STATISTICS XML ON
o início da consulta eSET STATISTICS XML OFF|ON
as áreas adjacentes que você não deseja que apareçam na saída do plano: achei isso útil quando a consulta contém uma iteração (ENQUANTO) você não deseja / precisa para ver no plano de execução (caso contrário, seria muito pesado e demorado para o SQL SERVER exibi-lo).Além da resposta abrangente já publicada às vezes, é útil poder acessar o plano de execução programaticamente para extrair informações. Código de exemplo para isso está abaixo.
StartCapture
Definição de ExemploStopCapture
Definição de Exemplofonte
fonte
Além dos métodos descritos nas respostas anteriores, você também pode usar um visualizador de plano de execução gratuito e a ferramenta de otimização de consultas ApexSQL Plan (na qual recentemente me deparei).
Você pode instalar e integrar o ApexSQL Plan ao SQL Server Management Studio, para que os planos de execução possam ser visualizados diretamente do SSMS.
Exibindo planos de execução estimados no plano ApexSQL
Exibindo planos de execução reais no plano ApexSQL
Para visualizar o plano de execução real de uma consulta, continue a partir da 2ª etapa mencionada anteriormente, mas agora, depois que o plano Estimado for exibido, clique no botão "Real" na barra de faixa de opções principal do ApexSQL Plan.
Depois que o botão "Real" é clicado, o plano de execução real será mostrado com uma visualização detalhada dos parâmetros de custo, juntamente com outros dados do plano de execução.
Mais informações sobre a visualização de planos de execução podem ser encontradas seguindo este link .
fonte
Minha ferramenta favorita para obter e analisar profundamente os planos de execução de consultas é o SQL Sentry Plan Explorer . É muito mais fácil de usar, conveniente e abrangente para a análise e visualização detalhadas dos planos de execução do que o SSMS.
Aqui está um exemplo de captura de tela para você ter uma idéia de qual funcionalidade é oferecida pela ferramenta:
É apenas uma das visualizações disponíveis na ferramenta. Observe um conjunto de guias na parte inferior da janela do aplicativo, que permite obter diferentes tipos de representação do seu plano de execução e também informações adicionais úteis.
Além disso, não notei nenhuma limitação de sua edição gratuita que impeça o uso diário ou o force a comprar a versão Pro eventualmente. Portanto, se você prefere ficar com a edição gratuita, nada o impede de fazê-lo.
ATUALIZAÇÃO: (Obrigado a Martin Smith ) O Plan Explorer agora é gratuito! Consulte http://www.sqlsentry.com/products/plan-explorer/sql-server-query-view para obter detalhes.
fonte
Speaking of third-party tools
quando ninguém mencionou ferramentas de terceiros.Os planos de consulta podem ser obtidos em uma sessão de Eventos Estendidos por meio do
query_post_execution_showplan
evento. Aqui está uma amostra da sessão XEvent:Depois de criar a sessão, (no SSMS), vá para o Pesquisador de Objetos e mergulhe em Gerenciamento | Eventos estendidos | Sessões. Clique com o botão direito do mouse na sessão "GetExecutionPlan" e inicie-a. Clique com o botão direito do mouse novamente e selecione "Watch Live Data".
Em seguida, abra uma nova janela de consulta e execute uma ou mais consultas. Aqui está um para o AdventureWorks:
Após alguns instantes, você verá alguns resultados na guia "GetExecutionPlan: Live Data". Clique em um dos eventos query_post_execution_showplan na grade e clique na guia "Plano de consulta" abaixo da grade. Deve ser semelhante a este:
EDIT : O código XEvent e a captura de tela foram gerados a partir do SQL / SSMS 2012 com SP2. Se você estiver usando SQL 2008 / R2, você pode ser capaz de ajustar o script para fazê-lo funcionar. Mas essa versão não possui uma GUI, portanto você precisaria extrair o XML do showplan, salvá-lo como um arquivo * .sqlplan e abri-lo no SSMS. Isso é complicado. XEvents não existia no SQL 2005 ou anterior. Portanto, se você não estiver no SQL 2012 ou posterior, sugiro fortemente uma das outras respostas postadas aqui.
fonte
A partir do SQL Server 2016+, o recurso Query Store foi introduzido para monitorar o desempenho. Ele fornece informações sobre a escolha e o desempenho do plano de consulta. Não é uma substituição completa de eventos de rastreamento ou estendidos, mas, à medida que evolui de versão para versão, podemos obter um armazenamento de consultas totalmente funcional em versões futuras do SQL Server. O fluxo primário do Query Store
Habilitando o Query Store : O Query Store funciona no nível do banco de dados no servidor.
tempdb
banco de dados.Coletar informações no Query Store : Coletamos todas as informações disponíveis das três lojas usando o Query Store DMV (Data Management Views).
Armazenamento do plano de consulta: Persiste nas informações do plano de execução e é responsável por capturar todas as informações relacionadas à compilação de consultas.
Armazenamento de Estatísticas de Tempo de Execução: Persiste nas informações de estatísticas de execução e é provavelmente o armazenamento atualizado com mais freqüência. Essas estatísticas representam dados de execução da consulta.
Armazenamento de estatísticas de espera de consulta: persistindo e capturando informações de estatísticas de espera.
NOTA: O Armazenamento de Estatísticas de Espera de Consulta está disponível apenas no SQL Server 2017+
fonte
Como no SQL Server Management Studio (já explicado), também é possível com o Datagrip, conforme explicado aqui .
fonte
Aqui está uma coisa importante a saber, além de tudo o que foi dito antes.
Os planos de consulta geralmente são muito complexos para serem representados pelo tipo de coluna XML interno que possui uma limitação de 127 níveis de elementos aninhados. Esse é um dos motivos pelos quais o sys.dm_exec_query_plan pode retornar
NULL
ou até gerar um erro nas versões anteriores do MS SQL, portanto, geralmente é mais seguro usar o sys.dm_exec_text_query_plan . O último também possui um recurso de bônus útil para selecionar um plano para uma declaração específica, em vez de para todo o lote. Veja como você o usa para exibir planos para instruções em execução no momento:A coluna de texto na tabela resultante, no entanto, não é muito útil em comparação com uma coluna XML. Para poder clicar no resultado a ser aberto em uma guia separada como um diagrama, sem precisar salvar seu conteúdo em um arquivo, você pode usar um pequeno truque (lembre-se de que não pode apenas usar
CAST(... AS XML)
), embora isso funcione apenas para um fila unica:fonte
Plano de execução estimado
O plano de execução estimado é gerado pelo Optimizer sem executar a consulta SQL.
Para obter o plano de execução estimado, você precisa habilitar a
SHOWPLAN_ALL
configuração antes de executar a consulta.DEFINIR SHOWPLAN_ALL ON
Agora, ao executar a seguinte consulta SQL:
O SQL Server irá gerar o seguinte plano estimado de execução:
Depois de executar a consulta, estamos interessados em obter o plano de execução estimado, é necessário desativar o
SHOWPLAN_ALL
, pois, caso contrário, a sessão atual do banco de dados gerará apenas o plano de execução estimado em vez de executar as consultas SQL fornecidas.Plano estimado do SQL Server Management Studio
No aplicativo SQL Server Management Studio, você pode obter facilmente o plano de execução estimado para qualquer consulta SQL pressionando o
CTRL+L
atalho de tecla.Plano de execução real
O plano de execução real do SQL é gerado pelo Optimizer ao executar a consulta SQL. Se as estatísticas da tabela do banco de dados forem precisas, o plano real não deve diferir significativamente do estimado.
Para obter o plano de execução real no SQL Server, é necessário habilitar as
STATISTICS IO, TIME, PROFILE
configurações, conforme ilustrado pelo seguinte comando SQL:Agora, ao executar a consulta anterior, o SQL Server gerará o seguinte plano de execução:
Depois de executar a consulta, estamos interessados em obter o plano de execução real, é necessário desativar as
STATISTICS IO, TIME, PROFILE ON
configurações como esta:Plano real do SQL Server Management Studio
No aplicativo SQL Server Management Studio, você pode obter facilmente o plano de execução estimado para qualquer consulta SQL pressionando o
CTRL+M
atalho de tecla.fonte
Você também pode fazê-lo via PowerShell usando SET STATISTICS XML ON para obter o plano real. Escrevi para mesclar planos de múltiplas instruções em um único plano;
fonte
Explicar o plano de execução pode ser muito detalhado e leva bastante tempo para ler, mas, em resumo, se você usar 'explanar' antes da consulta, ele deverá fornecer muitas informações, incluindo quais partes foram executadas primeiro e assim por diante. se você quiser ler um pouco mais de detalhes sobre isso, compilei um pequeno blog sobre isso, que também indica as referências corretas. https://medium.com/swlh/jetbrains-datagrip-explain-plan-ac406772c470
fonte