@@ -13,14 +13,15 @@ ALTER PROCEDURE dbo.sp_BlitzLock
1313 @AppName NVARCHAR (256 ) = NULL ,
1414 @HostName NVARCHAR (256 ) = NULL ,
1515 @LoginName NVARCHAR (256 ) = NULL ,
16- @EventSessionPath VARCHAR (256 ) = ' system_health*.xel' ,
16+ @EventSessionPath VARCHAR (256 ) = ' system_health*.xel' ,
17+ @VictimsOnly BIT = 0 ,
1718 @Debug BIT = 0 ,
1819 @Help BIT = 0 ,
1920 @Version VARCHAR (30 ) = NULL OUTPUT ,
2021 @VersionDate DATETIME = NULL OUTPUT ,
2122 @VersionCheckMode BIT = 0 ,
2223 @OutputDatabaseName NVARCHAR (256 ) = NULL ,
23- @OutputSchemaName NVARCHAR (256 ) = ' dbo' , -- dito as below
24+ @OutputSchemaName NVARCHAR (256 ) = ' dbo' , -- ditto as below
2425 @OutputTableName NVARCHAR (256 ) = ' BlitzLock' -- put a standard here no need to check later in the script
2526)
2627WITH RECOMPILE
@@ -184,6 +185,7 @@ You need to use an Azure storage account, and the path has to look like this: ht
184185 finding_group NVARCHAR (100 ),
185186 finding NVARCHAR (4000 )
186187 );
188+
187189 DECLARE @d VARCHAR (40 ), @StringToExecute NVARCHAR (4000 ),@StringToExecuteParams NVARCHAR (500 ),@r NVARCHAR (200 ),@OutputTableFindings NVARCHAR (100 );
188190 DECLARE @ServerName NVARCHAR (256 )
189191 DECLARE @OutputDatabaseCheck BIT ;
@@ -296,7 +298,9 @@ You need to use an Azure storage account, and the path has to look like this: ht
296298 AND LEFT (CAST (SERVERPROPERTY (' MachineName' ) AS VARCHAR (8000 )), 8 ) <> ' EC2AMAZ-'
297299 AND LEFT (CAST (SERVERPROPERTY (' ServerName' ) AS VARCHAR (8000 )), 8 ) <> ' EC2AMAZ-'
298300 AND db_id (' rdsadmin' ) IS NULL
299- UPDATE STATISTICS #t WITH ROWCOUNT = 100000000 , PAGECOUNT = 100000000 ;
301+ BEGIN
302+ UPDATE STATISTICS #t WITH ROWCOUNT = 100000000 , PAGECOUNT = 100000000 ;
303+ END
300304
301305 /* Grab the initial set of XML to parse*/
302306 SET @d = CONVERT (VARCHAR (40 ), GETDATE (), 109 );
@@ -342,7 +346,7 @@ You need to use an Azure storage account, and the path has to look like this: ht
342346 ISNULL (ca2 .ib .query(' .' ), ' ' ) AS input_buffer
343347 INTO #deadlock_process
344348 FROM ( SELECT dd .deadlock_xml ,
345- CONVERT (datetime , SWITCHOFFSET (CONVERT (datetimeoffset , dd .event_date ), DATENAME (TzOffset , SYSDATETIMEOFFSET ()))) AS event_date,
349+ CONVERT (DATETIME2 ( 7 ) , SWITCHOFFSET (CONVERT (datetimeoffset , dd .event_date ), DATENAME (TzOffset , SYSDATETIMEOFFSET ()))) AS event_date,
346350 dd .victim_id ,
347351 dd .deadlock_graph ,
348352 ca .dp .value (' @id' , ' NVARCHAR(256)' ) AS id,
@@ -373,7 +377,8 @@ You need to use an Azure storage account, and the path has to look like this: ht
373377 AND (ca .dp .value (' @hostname' , ' NVARCHAR(256)' ) = @HostName OR @HostName IS NULL )
374378 AND (ca .dp .value (' @loginname' , ' NVARCHAR(256)' ) = @LoginName OR @LoginName IS NULL )
375379 ) AS q
376- CROSS APPLY q .deadlock_xml .nodes (' //deadlock/process-list/process/inputbuf' ) AS ca2(ib);
380+ CROSS APPLY q .deadlock_xml .nodes (' //deadlock/process-list/process/inputbuf' ) AS ca2(ib)
381+ OPTION ( RECOMPILE );
377382
378383
379384 /* Parse execution stack XML*/
@@ -550,6 +555,12 @@ You need to use an Azure storage account, and the path has to look like this: ht
550555 CROSS APPLY ca .dr .nodes (' //owner-list/owner' ) AS o(l)
551556 OPTION ( RECOMPILE );
552557
558+ UPDATE d
559+ SET d .index_name = d .object_name
560+ + ' .HEAP'
561+ FROM #deadlock_owner_waiter AS d
562+ WHERE index_name IS NULL
563+ OPTION (RECOMPILE );
553564
554565 /* Parse parallel deadlocks*/
555566 SET @d = CONVERT (VARCHAR (40 ), GETDATE (), 109 );
@@ -600,7 +611,8 @@ You need to use an Azure storage account, and the path has to look like this: ht
600611 FROM #deadlock_resource_parallel AS drp
601612 )
602613 DELETE FROM c
603- WHERE c .rn > 1 ;
614+ WHERE c .rn > 1
615+ OPTION ( RECOMPILE );
604616
605617
606618 /* Get rid of nonsense*/
@@ -666,7 +678,8 @@ You need to use an Azure storage account, and the path has to look like this: ht
666678 ) AS step_id
667679 FROM #deadlock_process AS dp
668680 WHERE dp .client_app LIKE ' SQLAgent - %'
669- ) AS x;
681+ ) AS x
682+ OPTION ( RECOMPILE );
670683
671684
672685 ALTER TABLE #agent_job ADD job_name NVARCHAR (256 ),
@@ -682,7 +695,8 @@ You need to use an Azure storage account, and the path has to look like this: ht
682695 ON j.job_id = s.job_id
683696 JOIN #agent_job AS aj
684697 ON aj.job_id_guid = j.job_id
685- AND aj.step_id = s.step_id;' ;
698+ AND aj.step_id = s.step_id
699+ OPTION ( RECOMPILE );' ;
686700 EXEC (@StringToExecute);
687701 END
688702
@@ -699,7 +713,8 @@ You need to use an Azure storage account, and the path has to look like this: ht
699713 JOIN #agent_job AS aj
700714 ON dp .event_date = aj .event_date
701715 AND dp .victim_id = aj .victim_id
702- AND dp .id = aj .id ;
716+ AND dp .id = aj .id
717+ OPTION ( RECOMPILE );
703718
704719 /* Begin checks based on parsed values*/
705720
@@ -1067,7 +1082,7 @@ You need to use an Azure storage account, and the path has to look like this: ht
10671082 GROUP BY PARSENAME (dow .object_name , 3 ), dow .object_name
10681083 )
10691084 INSERT #deadlock_findings WITH (TABLOCKX )
1070- ( check_id, database_name , object_name , finding_group, finding )
1085+ ( check_id, database_name , object_name , finding_group, finding )
10711086 SELECT 10 AS check_id,
10721087 cs .database_name ,
10731088 cs .object_name ,
@@ -1124,7 +1139,8 @@ You need to use an Azure storage account, and the path has to look like this: ht
11241139 ' Agent Job Deadlocks' ,
11251140 RTRIM (COUNT (* )) + ' deadlocks from this Agent Job and Step'
11261141 FROM #agent_job AS aj
1127- GROUP BY DB_NAME (aj .database_id ), aj .job_name , aj .step_name ;
1142+ GROUP BY DB_NAME (aj .database_id ), aj .job_name , aj .step_name
1143+ OPTION ( RECOMPILE );
11281144
11291145 /* Thank you goodnight*/
11301146 INSERT #deadlock_findings WITH (TABLOCKX )
@@ -1159,14 +1175,14 @@ You need to use an Azure storage account, and the path has to look like this: ht
11591175 dp .wait_resource COLLATE DATABASE_DEFAULT AS wait_resource,
11601176 CONVERT (
11611177 XML ,
1162- STUFF (( SELECT DISTINCT NCHAR (10 )
1178+ STUFF (( SELECT DISTINCT NCHAR (10 )
11631179 + N ' <object>'
11641180 + ISNULL (c .object_name , N ' ' )
11651181 + N ' </object> ' COLLATE DATABASE_DEFAULT AS object_name
11661182 FROM #deadlock_owner_waiter AS c
1167- WHERE (dp .id = c .owner_id
1168- OR dp .victim_id = c .waiter_id )
1169- AND dp .event_date = c .event_date
1183+ WHERE ( dp .id = c .owner_id
1184+ OR dp .victim_id = c .waiter_id )
1185+ AND CONVERT ( DATE , dp .event_date ) = CONVERT ( DATE , c .event_date )
11701186 FOR XML PATH (N ' ' ), TYPE ).value (N ' .[1]' , N ' NVARCHAR(4000)' ),
11711187 1 , 1 , N ' ' )) AS object_names,
11721188 dp .wait_time ,
@@ -1229,7 +1245,7 @@ You need to use an Azure storage account, and the path has to look like this: ht
12291245 ROW_NUMBER () OVER ( PARTITION BY dp .event_date , dp .id ORDER BY dp .event_date ) AS dn,
12301246 DENSE_RANK () OVER ( ORDER BY dp .event_date ) AS en,
12311247 ROW_NUMBER () OVER ( PARTITION BY dp .event_date ORDER BY dp .event_date ) - 1 AS qn,
1232- NULL AS is_victim,
1248+ 1 AS is_victim,
12331249 cao .wait_type COLLATE DATABASE_DEFAULT AS owner_mode,
12341250 cao .waiter_type AS owner_waiter_type,
12351251 cao .owner_activity AS owner_activity,
@@ -1328,6 +1344,7 @@ You need to use an Azure storage account, and the path has to look like this: ht
13281344 d .deadlock_graph
13291345 FROM deadlocks AS d
13301346 WHERE d .dn = 1
1347+ AND (is_victim = @VictimsOnly OR @VictimsOnly = 0 )
13311348 AND d .en < CASE WHEN d .deadlock_type = N ' Parallel Deadlock' THEN 2 ELSE 2147483647 END
13321349 AND (DB_NAME (d .database_id ) = @DatabaseName OR @DatabaseName IS NULL )
13331350 AND (d .event_date >= @StartDate OR @StartDate IS NULL )
@@ -1370,14 +1387,14 @@ ELSE --Output to database is not set output to client app
13701387 dp .wait_resource COLLATE DATABASE_DEFAULT AS wait_resource,
13711388 CONVERT (
13721389 XML ,
1373- STUFF (( SELECT DISTINCT NCHAR (10 )
1390+ STUFF (( SELECT DISTINCT NCHAR (10 )
13741391 + N ' <object>'
13751392 + ISNULL (c .object_name , N ' ' )
13761393 + N ' </object> ' COLLATE DATABASE_DEFAULT AS object_name
13771394 FROM #deadlock_owner_waiter AS c
1378- WHERE (dp .id = c .owner_id
1379- OR dp .victim_id = c .waiter_id )
1380- AND dp .event_date = c .event_date
1395+ WHERE ( dp .id = c .owner_id
1396+ OR dp .victim_id = c .waiter_id )
1397+ AND CONVERT ( DATE , dp .event_date ) = CONVERT ( DATE , c .event_date )
13811398 FOR XML PATH (N ' ' ), TYPE ).value (N ' .[1]' , N ' NVARCHAR(4000)' ),
13821399 1 , 1 , N ' ' )) AS object_names,
13831400 dp .wait_time ,
@@ -1440,7 +1457,7 @@ ELSE --Output to database is not set output to client app
14401457 ROW_NUMBER () OVER ( PARTITION BY dp .event_date , dp .id ORDER BY dp .event_date ) AS dn,
14411458 DENSE_RANK () OVER ( ORDER BY dp .event_date ) AS en,
14421459 ROW_NUMBER () OVER ( PARTITION BY dp .event_date ORDER BY dp .event_date ) - 1 AS qn,
1443- NULL AS is_victim,
1460+ 1 AS is_victim,
14441461 cao .wait_type COLLATE DATABASE_DEFAULT AS owner_mode,
14451462 cao .waiter_type AS owner_waiter_type,
14461463 cao .owner_activity AS owner_activity,
@@ -1460,7 +1477,8 @@ ELSE --Output to database is not set output to client app
14601477 CROSS APPLY (SELECT TOP 1 * FROM #deadlock_resource_parallel AS drp WHERE drp .owner_id = dp .id AND drp .wait_type = ' e_waitPipeNewRow' ORDER BY drp .event_date ) AS cao
14611478 CROSS APPLY (SELECT TOP 1 * FROM #deadlock_resource_parallel AS drp WHERE drp .owner_id = dp .id AND drp .wait_type = ' e_waitPipeGetRow' ORDER BY drp .event_date ) AS caw
14621479 WHERE dp .victim_id IS NULL
1463- AND dp .login_name IS NOT NULL )
1480+ AND dp .login_name IS NOT NULL
1481+ )
14641482 SELECT d .deadlock_type ,
14651483 d .event_date ,
14661484 DB_NAME (d .database_id ) AS database_name ,
@@ -1502,6 +1520,7 @@ ELSE --Output to database is not set output to client app
15021520 d .deadlock_graph
15031521 FROM deadlocks AS d
15041522 WHERE d .dn = 1
1523+ AND (is_victim = @VictimsOnly OR @VictimsOnly = 0 )
15051524 AND d .en < CASE WHEN d .deadlock_type = N ' Parallel Deadlock' THEN 2 ELSE 2147483647 END
15061525 AND (DB_NAME (d .database_id ) = @DatabaseName OR @DatabaseName IS NULL )
15071526 AND (d .event_date >= @StartDate OR @StartDate IS NULL )
0 commit comments