@@ -193,6 +193,7 @@ SET @VersionDate = '20171201';
193
193
194
194
/* Parse process and input buffer XML*/
195
195
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,
196
197
ca .dp .value (' @id' , ' NVARCHAR(256)' ) AS id,
197
198
ca .dp .value (' @currentdb' , ' BIGINT' ) AS database_id,
198
199
ca .dp .value (' @logused' , ' BIGINT' ) AS log_used,
@@ -346,21 +347,34 @@ SET @VersionDate = '20171201';
346
347
CROSS APPLY ca .dr .nodes (' //owner-list/owner' ) AS o(l)
347
348
OPTION ( RECOMPILE );
348
349
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 owner_objects NVARCHAR (4000 ),
358
+ waiter_objects NVARCHAR (4000 ),
359
+ waiter_mode NVARCHAR (256 ),
360
+ owner_mode NVARCHAR (256 ),
361
+ is_victim AS CONVERT (BIT , CASE WHEN id = victim_id THEN 1 ELSE 0 END );
362
+
349
363
350
364
/* Begin checks based on parsed values*/
351
365
352
366
/* Check 1 is deadlocks by database*/
353
367
INSERT #deadlock_findings ( check_id, database_name , object_name , finding_group, finding, query_text )
354
368
SELECT 1 AS check_id,
355
- DB_NAME (dow .database_id ) AS database_name ,
369
+ DB_NAME (dp .database_id ) AS database_name ,
356
370
NULL AS object_name ,
357
371
' Total database locks' AS finding_group,
358
372
' This database had '
359
- + CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dow . owner_id ) + COUNT_BIG ( DISTINCT dow . waiter_id ))
373
+ + CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dp . event_date ))
360
374
+ ' deadlocks.' ,
361
375
NULL AS query_text
362
- FROM #deadlock_owner_waiter AS dow
363
- GROUP BY DB_NAME (dow .database_id )
376
+ FROM #deadlock_process AS dp
377
+ GROUP BY DB_NAME (dp .database_id )
364
378
OPTION ( RECOMPILE );
365
379
366
380
/* Check 2 is deadlocks by object*/
@@ -369,10 +383,10 @@ SET @VersionDate = '20171201';
369
383
SELECT 2 AS check_id,
370
384
DB_NAME (dow .database_id ) AS database_name ,
371
385
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 .' ,
386
+ ' Total object deadlocks ' AS finding_group,
387
+ ' This object was involved in '
388
+ + CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dow .object_name ))
389
+ + ' deadlock(s) .' ,
376
390
NULL AS query_text
377
391
FROM #deadlock_owner_waiter AS dow
378
392
GROUP BY DB_NAME (dow .database_id ), dow .object_name
@@ -420,7 +434,7 @@ SET @VersionDate = '20171201';
420
434
NULL AS object_name ,
421
435
' Login, App, and Host locking' AS finding_group,
422
436
' This database has had ' +
423
- CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dp .id )* 2 ) +
437
+ CONVERT (NVARCHAR (20 ), COUNT_BIG (DISTINCT dp .id )) +
424
438
' instances of deadlocks involving the login ' +
425
439
dp .login_name +
426
440
' from the application ' +
@@ -470,7 +484,7 @@ SET @VersionDate = '20171201';
470
484
' More Info - Query' AS finding_group,
471
485
' EXEC sp_BlitzCache ' +
472
486
CASE WHEN ds .proc_name = ' adhoc'
473
- THEN ' @OnlySqlhandles = ' +
487
+ THEN ' @OnlySqlHandles = ' +
474
488
QUOTENAME (ds .sql_handle , ' '' ' )
475
489
ELSE ' @StoredProcName = ' +
476
490
QUOTENAME (ds .proc_name , ' '' ' )
@@ -532,9 +546,9 @@ SET @VersionDate = '20171201';
532
546
DB_NAME (s .database_id ) AS database_name ,
533
547
OBJECT_SCHEMA_NAME (s .obj_id , s .database_id ) AS sch_name,
534
548
OBJECT_NAME (s .obj_id , s .database_id ) AS tbl_name,
535
- QUOTENAME ( OBJECT_SCHEMA_NAME (s .obj_id , s .database_id ) )
549
+ OBJECT_SCHEMA_NAME (s .obj_id , s .database_id )
536
550
+ N ' .'
537
- + QUOTENAME ( OBJECT_NAME (s .obj_id , s .database_id ) ) AS object_name ,
551
+ + OBJECT_NAME (s .obj_id , s .database_id ) AS object_name ,
538
552
CONVERT (VARCHAR (10 ), (s .wait_time / 1000 ) / 86400 ) AS wait_days,
539
553
CONVERT (VARCHAR (20 ), DATEADD (SECOND, (s .wait_time / 1000 ), 0 ), 108 ) AS wait_time_hms
540
554
FROM suey AS s
@@ -552,8 +566,6 @@ SET @VersionDate = '20171201';
552
566
FROM chopsuey AS cs
553
567
OPTION ( RECOMPILE );
554
568
555
-
556
-
557
569
/* Check 10 gets total deadlock wait time per database*/
558
570
WITH wait_time AS (
559
571
SELECT DB_NAME (dp .database_id ) AS database_name ,
@@ -578,7 +590,12 @@ SET @VersionDate = '20171201';
578
590
579
591
/* Thank you goodnight*/
580
592
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 );
593
+ VALUES ( - 1 ,
594
+ N ' sp_BlitzLock ' + CAST (CONVERT (DATETIME , @VersionDate, 102 ) AS VARCHAR (100 )),
595
+ N ' SQL Server First Responder Kit' ,
596
+ N ' http://FirstResponderKit.org/' ,
597
+ N ' To get help or add your own contributions, join us at http://FirstResponderKit.org.'
598
+ , NULL );
582
599
583
600
584
601
WITH deadlocks
@@ -629,7 +646,7 @@ SET @VersionDate = '20171201';
629
646
d .transaction_name
630
647
FROM deadlocks AS d
631
648
WHERE d .dn = 1
632
- ORDER BY d .event_date ;
649
+ ORDER BY d .event_date , d . last_batch_started , d . last_tran_started ;
633
650
634
651
635
652
0 commit comments