@@ -193,6 +193,7 @@ SET @VersionDate = '20171201';
193193
194194 /* Parse process and input buffer XML*/
195195 SELECT dd .deadlock_xml .value (' (event/@timestamp)[1]' , ' DATETIME2' ) AS event_date,
196+ dd .deadlock_xml .value (' (//deadlock/victim-list/victimProcess/@id)[1]' , ' NVARCHAR(256)' ) AS victim_id,
196197 ca .dp .value (' @id' , ' NVARCHAR(256)' ) AS id,
197198 ca .dp .value (' @currentdb' , ' BIGINT' ) AS database_id,
198199 ca .dp .value (' @logused' , ' BIGINT' ) AS log_used,
@@ -346,21 +347,47 @@ SET @VersionDate = '20171201';
346347 CROSS APPLY ca .dr .nodes (' //owner-list/owner' ) AS o(l)
347348 OPTION ( RECOMPILE );
348349
350+ /* Get rid of nonsense*/
351+ DELETE dow
352+ FROM #deadlock_owner_waiter AS dow
353+ WHERE owner_id = waiter_id
354+ 355+ /* Add some nonsense*/
356+ ALTER TABLE #deadlock_process
357+ ADD waiter_mode NVARCHAR (256 ),
358+ owner_mode NVARCHAR (256 ),
359+ is_victim AS CONVERT (BIT , CASE WHEN id = victim_id THEN 1 ELSE 0 END );
360+ 361+ /* Update some nonsense*/
362+ UPDATE dp
363+ SET dp .owner_mode = dow .owner_mode
364+ FROM #deadlock_process AS dp
365+ JOIN #deadlock_owner_waiter AS dow
366+ ON dp .id = dow .owner_id
367+ WHERE dp .is_victim = 0
368+ 369+ UPDATE dp
370+ SET dp .waiter_mode = dow .waiter_mode
371+ FROM #deadlock_process AS dp
372+ JOIN #deadlock_owner_waiter AS dow
373+ ON dp .victim_id = dow .waiter_id
374+ WHERE dp .is_victim = 1
375+ 349376
350377 /* Begin checks based on parsed values*/
351378
352379 /* Check 1 is deadlocks by database*/
353380 INSERT #deadlock_findings ( check_id, database_name , object_name , finding_group, finding, query_text )
354381 SELECT 1 AS check_id,
355- DB_NAME (dow .database_id ) AS database_name ,
382+ DB_NAME (dp .database_id ) AS database_name ,
356383 NULL AS object_name ,
357384 ' Total database locks' AS finding_group,
358385 ' This database had '
359- + CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dow . owner_id ) + COUNT_BIG ( DISTINCT dow . waiter_id ))
386+ + CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dp . event_date ))
360387 + ' deadlocks.' ,
361388 NULL AS query_text
362- FROM #deadlock_owner_waiter AS dow
363- GROUP BY DB_NAME (dow .database_id )
389+ FROM #deadlock_process AS dp
390+ GROUP BY DB_NAME (dp .database_id )
364391 OPTION ( RECOMPILE );
365392
366393 /* Check 2 is deadlocks by object*/
@@ -369,10 +396,10 @@ SET @VersionDate = '20171201';
369396 SELECT 2 AS check_id,
370397 DB_NAME (dow .database_id ) AS database_name ,
371398 dow .object_name AS object_name ,
372- ' Total object locks ' AS finding_group,
373- ' This object had '
374- + CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dow .owner_id ))
375- + ' deadlocks .' ,
399+ ' Total object deadlocks ' AS finding_group,
400+ ' This object was involved in '
401+ + CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dow .object_name ))
402+ + ' deadlock(s) .' ,
376403 NULL AS query_text
377404 FROM #deadlock_owner_waiter AS dow
378405 GROUP BY DB_NAME (dow .database_id ), dow .object_name
@@ -420,13 +447,13 @@ SET @VersionDate = '20171201';
420447 NULL AS object_name ,
421448 ' Login, App, and Host locking' AS finding_group,
422449 ' This database has had ' +
423- CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dp .id )* 2 ) +
450+ CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dp .id )) +
424451 ' instances of deadlocks involving the login ' +
425- dp .login_name +
452+ ISNULL ( dp .login_name , ' UNKNOWN' ) +
426453 ' from the application ' +
427- dp .client_app +
454+ ISNULL ( dp .client_app , ' UNKNOWN' ) +
428455 ' on host ' +
429- dp .host_name
456+ ISNULL ( dp .host_name , ' UNKNOWN' )
430457 AS finding,
431458 NULL AS query_text
432459 FROM #deadlock_process AS dp
@@ -470,7 +497,7 @@ SET @VersionDate = '20171201';
470497 ' More Info - Query' AS finding_group,
471498 ' EXEC sp_BlitzCache ' +
472499 CASE WHEN ds .proc_name = ' adhoc'
473- THEN ' @OnlySqlhandles = ' +
500+ THEN ' @OnlySqlHandles = ' +
474501 QUOTENAME (ds .sql_handle , ' '' ' )
475502 ELSE ' @StoredProcName = ' +
476503 QUOTENAME (ds .proc_name , ' '' ' )
@@ -532,9 +559,9 @@ SET @VersionDate = '20171201';
532559 DB_NAME (s .database_id ) AS database_name ,
533560 OBJECT_SCHEMA_NAME (s .obj_id , s .database_id ) AS sch_name,
534561 OBJECT_NAME (s .obj_id , s .database_id ) AS tbl_name,
535- QUOTENAME ( OBJECT_SCHEMA_NAME (s .obj_id , s .database_id ) )
562+ OBJECT_SCHEMA_NAME (s .obj_id , s .database_id )
536563 + N ' .'
537- + QUOTENAME ( OBJECT_NAME (s .obj_id , s .database_id ) ) AS object_name ,
564+ + OBJECT_NAME (s .obj_id , s .database_id ) AS object_name ,
538565 CONVERT (VARCHAR (10 ), (s .wait_time / 1000 ) / 86400 ) AS wait_days,
539566 CONVERT (VARCHAR (20 ), DATEADD (SECOND, (s .wait_time / 1000 ), 0 ), 108 ) AS wait_time_hms
540567 FROM suey AS s
@@ -547,13 +574,12 @@ SET @VersionDate = '20171201';
547574 ' This object has had '
548575 + CONVERT (VARCHAR (10 ), cs .wait_days )
549576 + ' :' + CONVERT (VARCHAR (20 ), cs .wait_time_hms , 108 )
550- + ' [d/h/m/s] of deadlock wait time.' ,
577+ + ' [d/h/m/s] of deadlock wait time.'AS finding ,
551578 NULL AS query_text
552579 FROM chopsuey AS cs
580+ WHERE cs .object_name IS NOT NULL
553581 OPTION ( RECOMPILE );
554582
555- 556- 557583 /* Check 10 gets total deadlock wait time per database*/
558584 WITH wait_time AS (
559585 SELECT DB_NAME (dp .database_id ) AS database_name ,
@@ -578,7 +604,12 @@ SET @VersionDate = '20171201';
578604
579605 /* Thank you goodnight*/
580606 INSERT #deadlock_findings ( check_id, database_name , object_name , finding_group, finding, query_text )
581- VALUES ( 0 , N ' sp_BlitzLock' , N ' SQL Server First Responder Kit' , N ' http://FirstResponderKit.org/' , N ' To get help or add your own contributions, join us at http://FirstResponderKit.org.' , NULL );
607+ VALUES ( - 1 ,
608+ N ' sp_BlitzLock ' + CAST (CONVERT (DATETIME , @VersionDate, 102 ) AS VARCHAR (100 )),
609+ N ' SQL Server First Responder Kit' ,
610+ N ' http://FirstResponderKit.org/' ,
611+ N ' To get help or add your own contributions, join us at http://FirstResponderKit.org.'
612+ , NULL );
582613
583614
584615 WITH deadlocks
@@ -610,13 +641,19 @@ SET @VersionDate = '20171201';
610641 dp .login_name ,
611642 dp .isolation_level ,
612643 dp .process_xml .value (' (//process/inputbuf/text())[1]' , ' NVARCHAR(MAX)' ) AS inputbuf,
613- ROW_NUMBER () OVER ( PARTITION BY dp .event_date , dp .id ORDER BY dp .event_date ) AS dn
644+ ROW_NUMBER () OVER ( PARTITION BY dp .event_date , dp .id ORDER BY dp .event_date ) AS dn,
645+ dp .is_victim ,
646+ ISNULL (dp .owner_mode , ' N/A' ) AS owner_mode,
647+ ISNULL (dp .waiter_mode , ' N/A' ) AS waiter_mode
614648 FROM #deadlock_process AS dp )
615649 SELECT d .event_date ,
616650 DB_NAME (d .database_id ) AS database_name ,
617651 CONVERT (XML , N ' <inputbuf>' + d .inputbuf + N ' </inputbuf>' ) AS query,
618652 d .object_names ,
619653 d .isolation_level ,
654+ d .is_victim ,
655+ d .owner_mode ,
656+ d .waiter_mode ,
620657 d .transaction_count ,
621658 d .login_name ,
622659 d .host_name ,
@@ -629,7 +666,7 @@ SET @VersionDate = '20171201';
629666 d .transaction_name
630667 FROM deadlocks AS d
631668 WHERE d .dn = 1
632- ORDER BY d .event_date ;
669+ ORDER BY d .event_date , d . last_batch_started , d . last_tran_started ;
633670
634671
635672
0 commit comments