DBAtlas · Atlas de operações de banco de dados

Ler deadlocks passados da sessão system_health (deadlock graph)

SQL ServerDesempenho

Comando

SET QUOTED_IDENTIFIER ON;  -- required for XML methods (sqlcmd/Agent default is OFF)
WITH dl AS (
    SELECT CAST(event_data AS XML) AS x
    FROM   sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL)
    WHERE  object_name = N'xml_deadlock_report'
)
SELECT TOP (20)
       x.value('(event/@timestamp)[1]', 'datetime2')                                          AS utc_time,
       x.value('(event/data/value/deadlock/victim-list/victimProcess/@id)[1]', 'varchar(50)')  AS victim,
       x.value('count(event/data/value/deadlock/process-list/process)', 'int')                 AS process_count,
       x.value('(event/data/value/deadlock/process-list/process/@currentdbname)[1]', 'sysname') AS db,
       x.query('event/data/value/deadlock')                                                    AS deadlock_graph
FROM   dl
ORDER BY utc_time DESC;

O que faz

Lê os eventos xml_deadlock_report do target event_file da sessão de Extended Events system_health (ativa por padrão); para cada deadlock, retorna o horário (UTC), o processo vítima, o número de participantes, o banco de dados e o XML completo do deadlock graph.

Quando usar

Quando a aplicação reporta o erro 1205, ao analisar a frequência de deadlocks e os objetos envolvidos; em servidores sem o trace flag 1222.

Atenção

Os arquivos do system_health são rotacionados; em um servidor movimentado, deadlocks mais antigos podem ter sumido, então crie uma sessão XE dedicada para um arquivo permanente. Ler muitos arquivos consome CPU; mantenha o TOP em horário comercial. Os eventos são gravados com atraso, então um deadlock novo aparece após alguns segundos. Somente leitura; seguro.

Abrir no DBAtlas →

Relacionados