Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0bff992

Browse files
Merge pull request BrentOzarULTD#1292 from BrentOzarULTD/Issue_1291
Issue 1291
2 parents d592f95 + 394a256 commit 0bff992

File tree

1 file changed

+58
-21
lines changed

1 file changed

+58
-21
lines changed

‎sp_BlitzLock.sql‎

Lines changed: 58 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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(DISTINCTdow.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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /