@@ -78,6 +78,7 @@ ALTER PROCEDURE
7878 @log_schema_name sysname = NULL , /* schema to store logging tables*/
7979 @log_table_name_prefix sysname = ' HumanEventsBlockViewer' , /* prefix for all logging tables*/
8080 @log_retention_days integer = 30 , /* Number of days to keep logs, 0 = keep indefinitely*/
81+ @max_blocking_events bigint = 5000 , /* maximum blocking events to analyze, 0 = unlimited*/
8182 @help bit = 0 , /* get help with this procedure*/
8283 @debug bit = 0 , /* print dynamic sql and select temp table contents*/
8384 @version varchar (30 ) = NULL OUTPUT , /* check the version number*/
@@ -131,6 +132,7 @@ BEGIN
131132 WHEN N ' @log_schema_name' THEN N ' schema to store logging tables'
132133 WHEN N ' @log_table_name_prefix' THEN N ' prefix for all logging tables'
133134 WHEN N ' @log_retention_days' THEN N ' how many days of data to retain'
135+ WHEN N ' @max_blocking_events' THEN N ' maximum blocking events to analyze, 0 = unlimited'
134136 WHEN N ' @help' THEN ' how you got here'
135137 WHEN N ' @debug' THEN ' dumps raw temp table contents'
136138 WHEN N ' @version' THEN ' OUTPUT; for support'
@@ -154,6 +156,7 @@ BEGIN
154156 WHEN N ' @log_schema_name' THEN N ' any valid schema name'
155157 WHEN N ' @log_table_name_prefix' THEN N ' any valid identifier'
156158 WHEN N ' @log_retention_days' THEN N ' a positive integer'
159+ WHEN N ' @max_blocking_events' THEN N ' 0 to 9223372036854775807 (0 = unlimited)'
157160 WHEN N ' @help' THEN ' 0 or 1'
158161 WHEN N ' @debug' THEN ' 0 or 1'
159162 WHEN N ' @version' THEN ' none; OUTPUT'
@@ -177,6 +180,7 @@ BEGIN
177180 WHEN N ' @log_schema_name' THEN N ' NULL (dbo)'
178181 WHEN N ' @log_table_name_prefix' THEN N ' HumanEventsBlockViewer'
179182 WHEN N ' @log_retention_days' THEN N ' 30'
183+ WHEN N ' @max_blocking_events' THEN N ' 5000'
180184 WHEN N ' @help' THEN ' 0'
181185 WHEN N ' @debug' THEN ' 0'
182186 WHEN N ' @version' THEN ' none; OUTPUT'
@@ -1136,11 +1140,18 @@ BEGIN
11361140 human_events_xml
11371141 )
11381142 SELECT
1139- human_events_xml = e .x .query(' .' )
1140- FROM #x AS x
1141- CROSS APPLY x .x .nodes (' /RingBufferTarget/event' ) AS e(x)
1142- WHERE e .x .exist(' @name[ .= "blocked_process_report"]' ) = 1
1143- AND e .x .exist(' @timestamp[. >= sql:variable("@start_date") and .< sql:variable("@end_date")]' ) = 1
1143+ human_events_xml
1144+ FROM
1145+ (
1146+ SELECT TOP (CASE WHEN @max_blocking_events > 0 THEN @max_blocking_events ELSE POWER (CONVERT (bigint , 2 ), 63 ) - 1 END )
1147+ human_events_xml = e .x .query(' .' ),
1148+ event_timestamp = e .x .value (' @timestamp' , ' datetime2' )
1149+ FROM #x AS x
1150+ CROSS APPLY x .x .nodes (' /RingBufferTarget/event' ) AS e(x)
1151+ WHERE e .x .exist(' @name[ .= "blocked_process_report"]' ) = 1
1152+ AND e .x .exist(' @timestamp[. >= sql:variable("@start_date") and .< sql:variable("@end_date")]' ) = 1
1153+ ORDER BY event_timestamp DESC
1154+ ) AS most_recent
11441155 OPTION (RECOMPILE );
11451156END ;
11461157
@@ -1160,11 +1171,18 @@ BEGIN
11601171 human_events_xml
11611172 )
11621173 SELECT
1163- human_events_xml = e .x .query(' .' )
1164- FROM #x AS x
1165- CROSS APPLY x .x .nodes (' /event' ) AS e(x)
1166- WHERE e .x .exist(' @name[ .= "blocked_process_report"]' ) = 1
1167- AND e .x .exist(' @timestamp[. >= sql:variable("@start_date") and .< sql:variable("@end_date")]' ) = 1
1174+ human_events_xml
1175+ FROM
1176+ (
1177+ SELECT TOP (CASE WHEN @max_blocking_events > 0 THEN @max_blocking_events ELSE POWER (CONVERT (bigint , 2 ), 63 ) - 1 END )
1178+ human_events_xml = e .x .query(' .' ),
1179+ event_timestamp = e .x .value (' @timestamp' , ' datetime2' )
1180+ FROM #x AS x
1181+ CROSS APPLY x .x .nodes (' /event' ) AS e(x)
1182+ WHERE e .x .exist(' @name[ .= "blocked_process_report"]' ) = 1
1183+ AND e .x .exist(' @timestamp[. >= sql:variable("@start_date") and .< sql:variable("@end_date")]' ) = 1
1184+ ORDER BY event_timestamp DESC
1185+ ) AS most_recent
11681186 OPTION (RECOMPILE );
11691187END ;
11701188
@@ -1211,22 +1229,30 @@ BEGIN
12111229 END ;
12121230
12131231 SELECT
1214- event_time =
1215- DATEADD
1216- (
1217- MINUTE,
1218- DATEDIFF
1232+ event_time,
1233+ human_events_xml
1234+ INTO #blocking_xml_sh
1235+ FROM
1236+ (
1237+ SELECT TOP (CASE WHEN @max_blocking_events > 0 THEN @max_blocking_events ELSE POWER (CONVERT (bigint , 2 ), 63 ) - 1 END )
1238+ event_time =
1239+ DATEADD
12191240 (
12201241 MINUTE,
1221- GETUTCDATE (),
1222- SYSDATETIME ()
1242+ DATEDIFF
1243+ (
1244+ MINUTE,
1245+ GETUTCDATE (),
1246+ SYSDATETIME ()
1247+ ),
1248+ w .x .value (' (//@timestamp)[1]' , ' datetime2' )
12231249 ),
1224- w .x .value ( ' (//@timestamp)[1]' , ' datetime2' )
1225- ),
1226- human_events_xml = w . x .query( ' //data[@name="data"]/value/queryProcessing/blockingTasks/blocked-process-report' )
1227- INTO #blocking_xml_sh
1228- FROM #sp_server_diagnostics_component_result AS wi
1229- CROSS APPLY wi . sp_server_diagnostics_component_result . nodes ( ' //event' ) AS w(x)
1250+ human_events_xml = w .x .query( ' //data[@name="data"]/value/queryProcessing/blockingTasks/blocked-process-report' ),
1251+ event_timestamp = w . x . value ( ' (//@timestamp)[1]' , ' datetime2' )
1252+ FROM #sp_server_diagnostics_component_result AS wi
1253+ CROSS APPLY wi . sp_server_diagnostics_component_result . nodes ( ' //event' ) AS w(x)
1254+ ORDER BY event_timestamp DESC
1255+ ) AS most_recent
12301256 OPTION (RECOMPILE );
12311257
12321258 IF @debug = 1
@@ -1992,7 +2018,7 @@ SELECT
19922018 isolation_level = bg .value (' (process/@isolationlevel)[1]' , ' nvarchar(50)' ),
19932019 log_used = bg .value (' (process/@logused)[1]' , ' bigint' ),
19942020 clientoption1 = bg .value (' (process/@clientoption1)[1]' , ' bigint' ),
1995- clientoption2 = bg .value (' (process/@clientoption1 )[1]' , ' bigint' ),
2021+ clientoption2 = bg .value (' (process/@clientoption2 )[1]' , ' bigint' ),
19962022 currentdbname = bg .value (' (process/@currentdbname)[1]' , ' nvarchar(128)' ),
19972023 currentdbid = bg .value (' (process/@currentdb)[1]' , ' integer' ),
19982024 blocking_level = 0 ,
0 commit comments