@@ -356,7 +356,7 @@ SET @VersionDate = '20171201';
356356 NULL AS object_name ,
357357 ' Total database locks' AS finding_group,
358358 ' 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 ) )
360360 + ' deadlocks.' ,
361361 NULL AS query_text
362362 FROM #deadlock_owner_waiter AS dow
@@ -420,7 +420,7 @@ SET @VersionDate = '20171201';
420420 NULL AS object_name ,
421421 ' Login, App, and Host locking' AS finding_group,
422422 ' This database has had ' +
423- CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dp .id )) +
423+ CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dp .id )* 2 ) +
424424 ' instances of deadlocks involving the login ' +
425425 dp .login_name +
426426 ' from the application ' +
@@ -506,22 +506,69 @@ SET @VersionDate = '20171201';
506506 FROM bi
507507 OPTION ( RECOMPILE );
508508
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+ 509556
510- /* Check 9 gets total deadlock wait time per database*/
557+ /* Check 10 gets total deadlock wait time per database*/
511558 WITH wait_time AS (
512559 SELECT DB_NAME (dp .database_id ) AS database_name ,
513560 SUM (CONVERT (BIGINT , dp .wait_time )) AS total_wait_time_ms
514561 FROM #deadlock_process AS dp
515562 GROUP BY DB_NAME (dp .database_id )
516563 )
517564 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,
519566 wt .database_name ,
520567 NULL AS object_name ,
521- ' Total deadlock wait time' AS finding_group,
568+ ' Total database deadlock wait time' AS finding_group,
522569 ' 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 )
525572 + ' [d/h/m/s] of deadlock wait time.' ,
526573 NULL AS query_text
527574 FROM wait_time AS wt
@@ -550,7 +597,7 @@ SET @VersionDate = '20171201';
550597 WHERE dp .id = dow .owner_id
551598 OR dp .id = dow .waiter_id
552599 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 ,
554601 dp .wait_time ,
555602 dp .transaction_name ,
556603 dp .last_tran_started ,
@@ -565,11 +612,10 @@ SET @VersionDate = '20171201';
565612 dp .process_xml .value (' (//process/inputbuf/text())[1]' , ' NVARCHAR(MAX)' ) AS inputbuf,
566613 ROW_NUMBER () OVER ( PARTITION BY dp .event_date , dp .id ORDER BY dp .event_date ) AS dn
567614 FROM #deadlock_process AS dp )
568- SELECT N ' Deadlock #' + CONVERT (NVARCHAR (10 ), d .dn ) AS trail_of_dead,
569- d .event_date ,
615+ SELECT d .event_date ,
570616 DB_NAME (d .database_id ) AS database_name ,
571617 CONVERT (XML , N ' <inputbuf>' + d .inputbuf + N ' </inputbuf>' ) AS query,
572- d .object_name ,
618+ d .object_names ,
573619 d .isolation_level ,
574620 d .transaction_count ,
575621 d .login_name ,
@@ -582,7 +628,8 @@ SET @VersionDate = '20171201';
582628 d .last_batch_completed ,
583629 d .transaction_name
584630 FROM deadlocks AS d
585- WHERE d .dn = 1 ;
631+ WHERE d .dn = 1
632+ ORDER BY d .event_date ;
586633
587634
588635
0 commit comments