DBAtlas · Atlas de operaciones de bases de datos

Leer deadlocks pasados desde la sesión system_health (deadlock graph)

SQL ServerRendimiento

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;

Qué hace

Lee los eventos xml_deadlock_report del destino event_file de la sesión de Extended Events system_health (activa por defecto); por cada deadlock devuelve la hora (UTC), el proceso víctima, el número de participantes, la base de datos y el XML completo del deadlock graph.

Cuándo usarlo

Cuando la aplicación reporta el error 1205, al analizar la frecuencia de deadlocks y los objetos implicados; en servidores sin el trace flag 1222.

Precaución

Los archivos de system_health rotan; en un servidor con carga los deadlocks antiguos pueden haber desaparecido, así que configure una sesión XE dedicada para un archivo permanente. Leer muchos archivos cuesta CPU; mantenga el TOP en horario laboral. Los eventos se escriben con retraso, por lo que un deadlock nuevo aparece tras unos segundos. Solo lectura; segura.

Abrir en DBAtlas →

Relacionado