Live Query Statistics ou "veja seus planos de execução enquanto sua query ainda está executando"

Em alguns cenários de tuning de queries grandes, com muitos JOINs, subqueries, CTE, etc e seria muito legal se fosse possível visualizar estes planos sendo executados em tempo real.

Desde a versão SQL Server 2014 podemos utilizar uma DMV sys.dm_exec_query_profiles

Utilizando o comando "SET STATISTICS PROFILE ON" podemos retornar dados do plano em formato de tabela

Segue abaixo um exemplo

 USE AdventureWorks2012
 
 --Configure query for profiling with sys.dm_exec_query_profiles
 SET STATISTICS PROFILE ON;
 GO
 
 --Next, run your query in this session
 SELECT * FROM [Sales].[SalesOrderDetailEnlarged] S ORDER BY S.rowguid
 GO
 
 --On other session get plan data
 SELECT * FROM sys.dm_exec_query_profiles

 

É um SELECT relativamente grande e com um ORDER BY propositalmente pesado

Realizando algumas colenas na DMV (sys.dm_exec_query_profiles) que te traz a informação em formato de tabela, com um pouco de criatividade e Excel você poderia conseguir uma analise.

Mas ainda não era isso que eu queria ... Eu queria realmente ver executando na hora.

Utilizando o SQL 2014 (SP1) ou maior + SSMS 2016 (Até este momento em versão preview) que agora será um download separado do DVD de instalação do SQL Server e compatível com diversas versões, recebendo atualizações mais frequentes.

E uma das novidades é o Live Query Statistics que pode ser feito de uma consulta que você está analisando ou de uma query de outra pessoa que ainda está executando e você não tem ideia de quanto falta para terminar

No cenário 1 vamos ver uma consulta que você esta fazendo um teste ou tuning. Considerando o mesmo cenário basta ativar a opção de Live Query Statistics.

E agora é só assistir o processo ser executado

19% Ainda buscando dados no índice cluster ...

 

26% o SCAN no índice terminou em 5.8s e agora o SORT está segurando

Veja que o que ainda esta executando as setas são tracejadas

 

86% e rodando

 

100% e tempo total de 51s. SORT pesado este não :)

 

O que mais podemos fazer?

 

Cenário 2: Alguém fez uma query gigante, talvez um update sem where e você quer saber quanto falta.

 

Ligando a opção de "SET STATISTICS PROFILE ON" antes da query executar ou ligando o monitoramento do evento XE "query_post_execution_showplan", você pode pegar as consultas pelo Activity Monitor

 IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='Live Query Statistics')
 DROP EVENT SESSION [Live Query Statistics] ON SERVER
 GO
 
 CREATE EVENT SESSION [Live Query Statistics] ON SERVER 
 ADD EVENT sqlserver.query_post_execution_showplan
 ADD TARGET package0.ring_buffer(SET max_events_limit=(5000))
 WITH (STARTUP_STATE=ON)
 GO
 
 ALTER EVENT SESSION [Live Query Statistics]
 ON SERVER
 STATE = START
 GO

 

Sonho com esta feature deste que comecei a trabalhar com SQL :)

 

Testem nos seus ambientes e comentem no post

 

This Sample Code is provided for the purpose of illustration only and is not intended to be used in a production environment.

THIS SAMPLE CODE AND ANY RELATED INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,

INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.

We grant You a nonexclusive, royalty-free right to use and modify the Sample Code and to reproduce and distribute

the object code form of the Sample Code, provided that You agree:

(i) to not use Our name, logo, or trademarks to market Your software product in which the Sample Code is embedded;

(ii) to include a valid copyright notice on Your software product in which the Sample Code is embedded; and

(iii) to indentify, hold harmless, and defend Us and Our suppliers from and against any claims or lawsuits,

including attorneys' fees, that arise or result from the use or distribution of the Sample Code.