График взаимоблокировок из расширенных событий не отображается

У меня есть этот запрос из Sql Server 2017 Query Performance Tuning (книга). Код для книги можно найти здесь: https://github.com/Apress/sql-server-2017-query-perf-tuning

DECLARE @path NVARCHAR(260)
--to retrieve the local path of system_health files 
SELECT @path = dosdlc.path
FROM sys.dm_os_server_diagnostics_log_configurations AS dosdlc;

SELECT @path = @path + N'system_health_*';

WITH fxd
AS (SELECT CAST(fx.event_data AS XML) AS Event_Data
    FROM sys.fn_xe_file_target_read_file(@path,
                                         NULL,
                                         NULL,
                                         NULL) AS fx )
SELECT dl.deadlockgraph
FROM
(   SELECT dl.query('.') AS deadlockgraph
    FROM fxd
        CROSS APPLY event_data.nodes('(/event/data/value/deadlock)') AS d(dl) ) AS dl;

Предполагается, что он захватит граф взаимоблокировок из расширенных событий. Я только что сгенерировал тупик, следуя этому примеру (Как имитировать тупик на SQL Server?< /а>).

Но когда я запускаю запрос, я получаю пустой набор результатов.


person xhr489    schedule 30.11.2020    source источник


Ответы (1)


Похоже, что ваша спецификация пути XML предназначена для цели кольцевого буфера XE, а не для цели файла. Попробуйте запрос ниже.

--Get xml_deadlock_report events from system_health session file target
WITH
      --get trace folder path and append session name with wildcard (assumes base file name is same as session name)
      all_trace_files AS (
        SELECT path + '\system_health*.xel' AS FileNamePattern
        FROM sys.dm_os_server_diagnostics_log_configurations
        )
      --get xml_deadlock_report events from all system_health trace files
    , deadlock_reports AS (
        SELECT CAST(event_data AS xml) AS deadlock_report_xml
        FROM all_trace_files
        CROSS APPLY sys.fn_xe_file_target_read_file ( FileNamePattern, NULL, NULL, NULL) AS trace_records
        WHERE trace_records.object_name like 'xml_deadlock_report'
    )
SELECT
      deadlock_report_xml.value('(/event/@timestamp)[1]', 'datetime2') AS UtcTimestamp
    , deadlock_report_xml AS DeadlockReportXml
FROM deadlock_reports;

Чтобы увидеть графический отчет о взаимоблокировке в SSMS, удалите открывающие/закрывающие теги event/data/value из начала/конца XML-документа и сохраните его как файл с расширением .xdl. Затем откройте файл в SSMS, чтобы увидеть график взаимоблокировок.

person Dan Guzman    schedule 30.11.2020
comment
Спасибо, когда я нажимаю на ссылку, она открывает XML-документ. Как я могу просмотреть график взаимоблокировок? - person xhr489; 30.11.2020
comment
@ Дэвид, я добавил это к своему ответу. - person Dan Guzman; 30.11.2020