@@ -13,7 +13,7 @@ ALTER PROCEDURE dbo.sp_BlitzLock
13
13
@AppName NVARCHAR (256 ) = NULL ,
14
14
@HostName NVARCHAR (256 ) = NULL ,
15
15
@LoginName NVARCHAR (256 ) = NULL ,
16
- @EventSessionPath VARCHAR (256 ) = ' xml_deadlock_report ' ,
16
+ @EventSessionPath VARCHAR (256 ) = ' system_health*.xel ' ,
17
17
@Debug BIT = 0 ,
18
18
@Help BIT = 0 ,
19
19
@VersionDate DATETIME = NULL OUTPUT
@@ -356,7 +356,7 @@ SET @VersionDate = '20171201';
356
356
NULL AS object_name ,
357
357
' Total database locks' AS finding_group,
358
358
' This database had '
359
- + CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dow .owner_id ))
359
+ + CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dow .owner_id )+ COUNT_BIG ( DISTINCT dow . waiter_id ) )
360
360
+ ' deadlocks.' ,
361
361
NULL AS query_text
362
362
FROM #deadlock_owner_waiter AS dow
@@ -420,7 +420,7 @@ SET @VersionDate = '20171201';
420
420
NULL AS object_name ,
421
421
' Login, App, and Host locking' AS finding_group,
422
422
' This database has had ' +
423
- CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dp .id )) +
423
+ CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dp .id )* 2 ) +
424
424
' instances of deadlocks involving the login ' +
425
425
dp .login_name +
426
426
' from the application ' +
@@ -506,22 +506,69 @@ SET @VersionDate = '20171201';
506
506
FROM bi
507
507
OPTION ( RECOMPILE );
508
508
509
+ /* Check 9 gets total deadlock wait time per object*/
510
+ WITH chop AS (
511
+ SELECT SUBSTRING (dp .wait_resource ,
512
+ CHARINDEX (' :' , dp .wait_resource , CHARINDEX (' :' , dp .wait_resource )) + 2 ,
513
+ LEN (dp .wait_resource )
514
+ ) AS chopped,
515
+ dp .database_id ,
516
+ SUM (dp .wait_time ) AS wait_time
517
+ FROM #deadlock_process AS dp
518
+ GROUP BY dp .wait_resource , dp .database_id
519
+ ),
520
+ suey AS (
521
+ SELECT SUBSTRING (c .chopped ,
522
+ CHARINDEX (' :' , c .chopped ) + 1 ,
523
+ CHARINDEX (' :' , c .chopped , CHARINDEX (' :' , c .chopped ) + 1 )
524
+ - 1 - CHARINDEX (' :' , c .chopped )
525
+ ) AS obj_id,
526
+ c .database_id ,
527
+ c .wait_time
528
+ FROM chop AS c
529
+ ),
530
+ chopsuey AS (
531
+ SELECT * ,
532
+ DB_NAME (s .database_id ) AS database_name ,
533
+ OBJECT_SCHEMA_NAME (s .obj_id , s .database_id ) AS sch_name,
534
+ OBJECT_NAME (s .obj_id , s .database_id ) AS tbl_name,
535
+ QUOTENAME (OBJECT_SCHEMA_NAME (s .obj_id , s .database_id ))
536
+ + N ' .'
537
+ + QUOTENAME (OBJECT_NAME (s .obj_id , s .database_id )) AS object_name ,
538
+ CONVERT (VARCHAR (10 ), (s .wait_time / 1000 ) / 86400 ) AS wait_days,
539
+ CONVERT (VARCHAR (20 ), DATEADD (SECOND, (s .wait_time / 1000 ), 0 ), 108 ) AS wait_time_hms
540
+ FROM suey AS s
541
+ )
542
+ INSERT #deadlock_findings ( check_id, database_name , object_name , finding_group, finding, query_text )
543
+ SELECT 9 AS check_id,
544
+ cs .database_name ,
545
+ cs .object_name ,
546
+ ' Total object deadlock wait time' AS finding_group,
547
+ ' This object has had '
548
+ + CONVERT (VARCHAR (10 ), cs .wait_days )
549
+ + ' :' + CONVERT (VARCHAR (20 ), cs .wait_time_hms , 108 )
550
+ + ' [d/h/m/s] of deadlock wait time.' ,
551
+ NULL AS query_text
552
+ FROM chopsuey AS cs
553
+ OPTION ( RECOMPILE );
554
+
555
+
509
556
510
- /* Check 9 gets total deadlock wait time per database*/
557
+ /* Check 10 gets total deadlock wait time per database*/
511
558
WITH wait_time AS (
512
559
SELECT DB_NAME (dp .database_id ) AS database_name ,
513
560
SUM (CONVERT (BIGINT , dp .wait_time )) AS total_wait_time_ms
514
561
FROM #deadlock_process AS dp
515
562
GROUP BY DB_NAME (dp .database_id )
516
563
)
517
564
INSERT #deadlock_findings ( check_id, database_name , object_name , finding_group, finding, query_text )
518
- SELECT 9 AS check_id,
565
+ SELECT 10 AS check_id,
519
566
wt .database_name ,
520
567
NULL AS object_name ,
521
- ' Total deadlock wait time' AS finding_group,
568
+ ' Total database deadlock wait time' AS finding_group,
522
569
' This database has had '
523
- + CONVERT (VARCHAR (10 ), (SUM (wt .total_wait_time_ms ) / 1000 ) / 86400 )
524
- + ' :' + CONVERT (VARCHAR (20 ), DATEADD (s , (SUM (wt .total_wait_time_ms ) / 1000 ), 0 ), 108 )
570
+ + CONVERT (VARCHAR (10 ), (SUM (DISTINCT wt .total_wait_time_ms ) / 1000 ) / 86400 )
571
+ + ' :' + CONVERT (VARCHAR (20 ), DATEADD (SECOND , (SUM (DISTINCT wt .total_wait_time_ms ) / 1000 ), 0 ), 108 )
525
572
+ ' [d/h/m/s] of deadlock wait time.' ,
526
573
NULL AS query_text
527
574
FROM wait_time AS wt
@@ -550,7 +597,7 @@ SET @VersionDate = '20171201';
550
597
WHERE dp .id = dow .owner_id
551
598
OR dp .id = dow .waiter_id
552
599
FOR XML PATH (N ' ' ), TYPE ).value (N ' .[1]' , N ' NVARCHAR(4000)' ),
553
- 1 , 1 , N ' ' )) AS object_name ,
600
+ 1 , 1 , N ' ' )) AS object_names ,
554
601
dp .wait_time ,
555
602
dp .transaction_name ,
556
603
dp .last_tran_started ,
@@ -563,26 +610,26 @@ SET @VersionDate = '20171201';
563
610
dp .login_name ,
564
611
dp .isolation_level ,
565
612
dp .process_xml .value (' (//process/inputbuf/text())[1]' , ' NVARCHAR(MAX)' ) AS inputbuf,
566
- ROW_NUMBER () OVER ( PARTITION BY dp .event_date , dp .id ORDER BY dp .event_date ) AS n
613
+ ROW_NUMBER () OVER ( PARTITION BY dp .event_date , dp .id ORDER BY dp .event_date ) AS dn
567
614
FROM #deadlock_process AS dp )
568
- SELECT N ' Deadlock #' + CONVERT (NVARCHAR (10 ), d .n ) AS deadlock_number,
569
- d .event_date ,
615
+ SELECT d .event_date ,
570
616
DB_NAME (d .database_id ) AS database_name ,
571
617
CONVERT (XML , N ' <inputbuf>' + d .inputbuf + N ' </inputbuf>' ) AS query,
572
- d .object_name ,
618
+ d .object_names ,
573
619
d .isolation_level ,
574
620
d .transaction_count ,
575
621
d .login_name ,
576
622
d .host_name ,
577
623
d .client_app ,
578
624
d .wait_time ,
579
- d . transaction_name ,
625
+ d . log_used ,
580
626
d .last_tran_started ,
581
627
d .last_batch_started ,
582
628
d .last_batch_completed ,
583
- d . log_used
629
+ d . transaction_name
584
630
FROM deadlocks AS d
585
- WHERE d .n = 1 ;
631
+ WHERE d .dn = 1
632
+ ORDER BY d .event_date ;
586
633
587
634
588
635
0 commit comments