Ultimamente, tenho explorado o uso de eventos estendidos no SQL Server para me ajudar a comparar e otimizar várias consultas. Até agora, para visualizar os dados do evento, tenho usado o recurso "Assistir dados ao vivo" no SSMS.
O problema que estou tendo é que parece que o recurso Live Events usa um buffer interno, o que significa que às vezes preciso executar uma consulta várias vezes para obter suas informações para exibição na janela. Portanto, tenho uma pergunta em duas partes a fazer:
- Existe uma maneira de contornar esse atraso na exibição dos eventos no feed ao vivo? (Estou fazendo isso em um banco de dados local, então o desempenho não é um problema)
- O feed ao vivo é a melhor maneira de visualizar dados de eventos estendidos? Existe outra ferramenta no SSMS ou não que se adapte melhor ao meu caso de uso?
ATUALIZAR
Como solicitado, aqui está a sessão:
CREATE EVENT SESSION [Simple Query Benchmarking] ON SERVER
ADD EVENT sqlserver.sql_batch_completed(SET collect_batch_text=(1)
ACTION(sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.sql_text)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [package0].[greater_than_uint64]([duration],(1000))))
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=1 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO
Advertência : Grande parte das informações fornecidas abaixo aprendi estritamente ao passar por dois cursos Pluralsight de Jonathan Keyhayias . Vale a pena a despesa de um mês para a assinatura adicional para passar por seus dois cursos.
Primeiro, apenas alguns pontos de interesse que acho que ajudarão (ou no máximo serão interessantes):
synchronous
ouasynchronous
em como eles recebem dados. Os dois alvos mais comumente usados, sendo o arquivo de destino e o buffer de anel, são ambos assíncronos. O artigo BOL aqui indica o tipo de cada alvo .MAX_DISPATCH_LATENCY
é uma opção de configuração que controla quando os dados do evento são despachados para o(s) destino(s). O envio ocorre apenas para destinos assíncronos. Há duas condições que farão com que os dados do evento sejam despachados: (1) o buffer de memória da sessão está cheio ou (2) os dados do evento no buffer excedem aMAX_DISPATCH_LATENCY
opção configurada da sessão.Agora, para pontos específicos em sua pergunta:
Não estou ciente de que ele faz isso além do que afirmei acima. Eu esperaria que o evento fosse capturado, ele simplesmente não atendeu aos limites necessários para que fosse despachado para o visualizador de dados ao vivo. Eu testei isso com a seguinte consulta de
AdventureWorks2012
:Usando sua configuração de sessão de evento, com a exceção de que estou filtrando apenas para capturar dados para
AdventureWorks2012
banco de dados em minha instância local, posso visualizar os dados de destino para esta sessão e descobrir que a consulta foi capturada:Executar esta consulta mais uma vez fará com que ela seja despachada e o visualizador de dados exiba um evento. Agora, se você realmente deseja ver todos os eventos exibidos, simplesmente
STOP
a sessão e o buffer serão totalmente despachados. Eu vejo isso quando paro minha sessão:Eu pensei que você poderia mudar
MAX_MEMORY
para um valor menor que indicaria um pequeno tamanho de buffer para capturar eventos. No entanto, o valor mais baixo que você pode definir no SQL Server 2012 é200KB
, que a consulta que usei não atende a esse limite para fazer com que ela seja despachada imediatamente. A única coisa que eu poderia fazer era no máximo executar uma consulta que fizesse com que o buffer fosse atingido e os eventos anteriores capturados fossem despachados:Não que eu saiba atualmente. Eu sugeriria que o melhor método para obter os dados assim que eles ocorrem é consultar o XML para o
ring_buffer
destino e apenas destruí-lo. Posso repetir o exemplo acima e assim que executar a consulta abaixo vejo o evento..Net 4.7.2 tem uma correção para reduzir o atraso inicial para exibição de eventos ao usar o alvo ativo.