W pierwszej części artykułu opisywałem cały proces XE dotyczący łapania blokowanych procesów. Dodaję rozszerzone zapytanie odczytujące dane z pliku używając funkcji sys.fn_xe_file_target_read_file.
001 | drop table IF exists #events_cte |
003 | ; WITH events_cte AS ( |
008 | DATEDIFF(mi, GETUTCDATE(), CURRENT_TIMESTAMP ), |
009 | xevents.event_data.value( |
010 | '(event/@timestamp)[1]' , 'datetime2' )) AS [event time ] , |
011 | xevents.event_data.value( |
012 | '(event/action[@name="client_app_name"]/value)[1]' , 'nvarchar(128)' ) |
013 | AS [client app name ], |
014 | xevents.event_data.value( |
015 | '(event/action[@name="client_hostname"]/value)[1]' , 'nvarchar(max)' ) |
016 | AS [client host name ], |
017 | xevents.event_data.value( |
018 | '(event[@name="blocked_process_report"]/data[@name="database_name"]/value)[1]' , 'nvarchar(max)' ) |
020 | xevents.event_data.value( |
021 | '(event[@name="blocked_process_report"]/data[@name="database_id"]/value)[1]' , 'int' ) |
023 | xevents.event_data.value( |
024 | '(event[@name="blocked_process_report"]/data[@name="object_id"]/value)[1]' , 'int' ) |
026 | xevents.event_data.value( |
027 | '(event[@name="blocked_process_report"]/data[@name="index_id"]/value)[1]' , 'int' ) |
029 | xevents.event_data.value( |
030 | '(event[@name="blocked_process_report"]/data[@name="duration"]/value)[1]' , 'bigint' ) / 1000 |
032 | xevents.event_data.value( |
033 | '(event[@name="blocked_process_report"]/data[@name="lock_mode"]/text)[1]' , 'varchar' ) |
035 | xevents.event_data.value( |
036 | '(event[@name="blocked_process_report"]/data[@name="login_sid"]/value)[1]' , 'int' ) |
038 | xevents.event_data.query( |
039 | '(event[@name="blocked_process_report"]/data[@name="blocked_process"]/value/blocked-process-report)[1]' ) |
040 | AS blocked_process_report, |
041 | xevents.event_data.query( |
042 | '(event/data[@name="xml_report"]/value/deadlock)[1]' ) |
046 | FROM sys.fn_xe_file_target_read_file |
047 | ( 'K:\XE\Capture_BlockedProcessReport*.xel' , NULL , null , null ) |
048 | CROSS APPLY ( SELECT CAST (event_data AS XML) AS event_data) as xevents |
053 | WHEN blocked_process_report.value( '(blocked-process-report[@monitorLoop])[1]' , 'nvarchar(max)' ) IS NULL THEN 'Deadlock' |
054 | ELSE 'Blocked Process' |
057 | , CASE [client app name ] |
058 | WHEN '' THEN ' -- N/A -- ' |
059 | ELSE [client app name ] |
060 | END AS [client app _name] |
061 | , CASE [client host name ] |
062 | WHEN '' THEN ' -- N/A -- ' |
063 | ELSE [client host name ] |
064 | END AS [client host name ] |
066 | , COALESCE (OBJECT_SCHEMA_NAME(object_id, database_id), ' -- N/A -- ' ) AS [ schema ] |
067 | , COALESCE (OBJECT_NAME(object_id, database_id), ' -- N/A -- ' ) AS [ table ] |
071 | , COALESCE (SUSER_NAME(login_sid), ' -- N/A -- ' ) AS username |
073 | WHEN blocked_process_report.value( '(blocked-process-report[@monitorLoop])[1]' , 'nvarchar(max)' ) IS NULL THEN deadlock_graph |
074 | ELSE blocked_process_report |
076 | , monitorLoop = blocked_process_report.value( '(//@monitorLoop)[1]' , 'nvarchar(100)' ) |
079 | blocked_spid = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@spid)[1]' , 'int' ) |
082 | blocked_ecid = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@ecid)[1]' , 'int' ) |
083 | , blocked_taskpriority = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@taskpriority)[1]' , 'int' ) |
084 | , blocked_logused = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@logused)[1]' , 'int' ) |
085 | , blocked_waitresource = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@waitresource)[1]' , 'nvarchar(100)' ) |
086 | , blocked_resourcename = master.dbo.GetResourceName(blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@waitresource)[1]' , 'nvarchar(100)' ), NULL ) |
087 | , blocked_waittime = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@waittime)[1]' , 'int' ) |
088 | , blocked_ownerId = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@ownerId)[1]' , 'bigint' ) |
089 | , blocked_transactionname = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@transactionname)[1]' , 'nvarchar(100)' ) |
090 | , blocked_lasttranstarted = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@lasttranstarted )[1]' , 'datetime' ) |
091 | , blocked_XDES = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@lasttranstarted )[1]' , 'nvarchar(100)' ) |
092 | , blocked_lockMod = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@lockMode)[1]' , 'nvarchar(100)' ) |
093 | , blocked_schedulerid = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@schedulerid)[1]' , 'int' ) |
096 | Process Status – is it running, sleeping or suspended? |
097 | If it’s sleeping, it could be the sign that client does not work with transations correctly |
098 | – either did not commit one of the nested transactions or , perhaps, mixed them with UI activity. |
099 | Suspended status could be the sign of the blocking chain which is another story |
101 | blocked_status = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@status)[1]' , 'nvarchar(100)' ) |
102 | , blocked_priority = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@priority)[1]' , 'int' ) |
106 | TranCount – if it’s more than one, it would tell us that we have nested transactions and again, |
107 | perhaps, client does not handle them correctly. |
109 | blocked_trancount = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@trancount)[1]' , 'int' ) |
110 | , blocked_lastbatchstarted = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@lasttranstarted )[1]' , 'datetime' ) |
111 | , blocked_lastbatchcompleted = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@lastbatchcompleted )[1]' , 'datetime' ) |
112 | , blocked_lastattention = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@lastattention )[1]' , 'datetime' ) |
113 | , blocked_hostpid = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@hostpid)[1]' , 'int' ) |
114 | , blocked_isolationlevel = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@isolationlevel)[1]' , 'nvarchar(100)' ) |
115 | , blocked_xactid = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@xactid)[1]' , 'bigint' ) |
116 | , blocked_currentdbname = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@currentdbname)[1]' , 'nvarchar(100)' ) |
117 | , blocked_lockTimeout = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@lockTimeout)[1]' , 'bigint' ) |
118 | , blocked_clientoption1 = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@clientoption1)[1]' , 'bigint' ) |
119 | , blocked_clientoption2 = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/@clientoption2)[1]' , 'bigint' ) |
123 | blocked_line = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/executionStack/frame/@line)[1]' , 'int' ) |
124 | , blocked_stmtstart = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/executionStack/frame/@stmtstart)[1]' , 'int' ) |
125 | , blocked_stmtend = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/executionStack/frame/@stmtend)[1]' , 'int' ) |
126 | , blocked_sqlhandle = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/executionStack/frame/@sqlhandle)[1]' , 'nvarchar(100)' ) |
127 | , blocked_inputbuf = blocked_process_report.value( '(/blocked-process-report/blocked-process/process/inputbuf)[1]' , 'nvarchar(1000)' ) |
130 | blocking_spid = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@spid)[1]' , 'int' ) |
131 | , blocking_ecid = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@ecid)[1]' , 'int' ) |
132 | , blocking_status = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@status)[1]' , 'nvarchar(100)' ) |
133 | , blocking_priorit = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@priority)[1]' , 'int' ) |
134 | , blocking_trancount = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@trancount)[1]' , 'int' ) |
135 | , blocking_lastbatchstarted = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@lastbatchstarted)[1]' , 'datetime' ) |
136 | , blocking_lastbatchcompleted = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@lastbatchcompleted)[1]' , 'datetime' ) |
137 | , blocking_lastattention = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@lastattention)[1]' , 'datetime' ) |
138 | , blocking_clientapp = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@clientapp)[1]' , 'nvarchar(100)' ) |
139 | , blocking_hostname = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@hostname)[1]' , 'nvarchar(100)' ) |
140 | , blocking_hostpid = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@hostpid)[1]' , 'int' ) |
141 | , blocking_loginname = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@loginname)[1]' , 'nvarchar(100)' ) |
142 | , blocking_isolationlevel = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@isolationlevel)[1]' , 'nvarchar(100)' ) |
143 | , blocking_xactid = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@xactid)[1]' , 'bigint' ) |
144 | , blocking_currentdbname = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@currentdbname)[1]' , 'nvarchar(100)' ) |
145 | , blocking_lockTimeout = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@lockTimeout)[1]' , 'bigint' ) |
146 | , blocking_clientoption1 = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@clientoption1)[1]' , 'bigint' ) |
147 | , blocking_clientoption2 = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/@clientoption2)[1]' , 'bigint' ) |
151 | blocking_line = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/executionStack/frame/@line)[1]' , 'int' ) |
152 | , blocking_stmtstart = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/executionStack/frame/@stmtstart)[1]' , 'int' ) |
153 | , blocking_stmtend = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/executionStack/frame/@stmtend)[1]' , 'int' ) |
154 | , blocking_sqlhandle = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/executionStack/frame/@sqlhandle)[1]' , 'nvarchar(100)' ) |
155 | , blocking_inputbuf = blocked_process_report.value( '(/blocked-process-report/blocking-process/process/inputbuf)[1]' , 'nvarchar(1000)' ) |