Skip to content

Commit 636fb32

Browse files
committed
Adds filtering and recompiling
I added a proc level recompile, and I had missed a couple recompile hints on updates and deletes. Fixes #1398 I also added check level filtering for all the variables in the proc. Not every table has all of the possible filtering elements, so counts will look a little bit off. I suppose I could look into making a "wide" table to work off of, but I'm okay with this for now. Fixes #1395
1 parent 7123a92 commit 636fb32

File tree

1 file changed

+91
-4
lines changed

1 file changed

+91
-4
lines changed

sp_BlitzLock.sql

Lines changed: 91 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ ALTER PROCEDURE dbo.sp_BlitzLock
1818
@Help BIT = 0,
1919
@VersionDate DATETIME = NULL OUTPUT
2020
)
21+
WITH RECOMPILE
2122
AS
2223
BEGIN
2324

@@ -313,7 +314,8 @@ SET @VersionDate = '20180101';
313314
/*Get rid of nonsense*/
314315
DELETE dow
315316
FROM #deadlock_owner_waiter AS dow
316-
WHERE dow.owner_id = dow.waiter_id;
317+
WHERE dow.owner_id = dow.waiter_id
318+
OPTION ( RECOMPILE );
317319

318320
/*Add some nonsense*/
319321
ALTER TABLE #deadlock_process
@@ -328,15 +330,17 @@ SET @VersionDate = '20180101';
328330
JOIN #deadlock_owner_waiter AS dow
329331
ON dp.id = dow.owner_id
330332
AND dp.event_date = dow.event_date
331-
WHERE dp.is_victim = 0;
333+
WHERE dp.is_victim = 0
334+
OPTION ( RECOMPILE );
332335

333336
UPDATE dp
334337
SET dp.waiter_mode = dow.waiter_mode
335338
FROM #deadlock_process AS dp
336339
JOIN #deadlock_owner_waiter AS dow
337340
ON dp.victim_id = dow.waiter_id
338341
AND dp.event_date = dow.event_date
339-
WHERE dp.is_victim = 1;
342+
WHERE dp.is_victim = 1
343+
OPTION ( RECOMPILE );
340344

341345

342346
/*Begin checks based on parsed values*/
@@ -351,6 +355,13 @@ SET @VersionDate = '20180101';
351355
+ CONVERT(NVARCHAR(20), COUNT_BIG(DISTINCT dp.event_date))
352356
+ ' deadlocks.'
353357
FROM #deadlock_process AS dp
358+
WHERE 1 = 1
359+
AND (DB_NAME(dp.database_id) = @DatabaseName OR @DatabaseName IS NULL)
360+
AND (dp.event_date >= @StartDate OR @StartDate IS NULL)
361+
AND (dp.event_date < @EndDate OR @EndDate IS NULL)
362+
AND (dp.client_app = @AppName OR @AppName IS NULL)
363+
AND (dp.host_name = @HostName OR @HostName IS NULL)
364+
AND (dp.login_name = @LoginName OR @LoginName IS NULL)
354365
GROUP BY DB_NAME(dp.database_id)
355366
OPTION ( RECOMPILE );
356367

@@ -365,6 +376,11 @@ SET @VersionDate = '20180101';
365376
+ CONVERT(NVARCHAR(20), COUNT_BIG(DISTINCT dow.object_name))
366377
+ ' deadlock(s).'
367378
FROM #deadlock_owner_waiter AS dow
379+
WHERE 1 = 1
380+
AND (DB_NAME(dow.database_id) = @DatabaseName OR @DatabaseName IS NULL)
381+
AND (dow.event_date >= @StartDate OR @StartDate IS NULL)
382+
AND (dow.event_date < @EndDate OR @EndDate IS NULL)
383+
AND (dow.object_name = @ObjectName OR @ObjectName IS NULL)
368384
GROUP BY DB_NAME(dow.database_id), dow.object_name
369385
OPTION ( RECOMPILE );
370386

@@ -381,6 +397,12 @@ SET @VersionDate = '20180101';
381397
AS finding
382398
FROM #deadlock_process AS dp
383399
WHERE dp.isolation_level LIKE 'serializable%'
400+
AND (DB_NAME(dp.database_id) = @DatabaseName OR @DatabaseName IS NULL)
401+
AND (dp.event_date >= @StartDate OR @StartDate IS NULL)
402+
AND (dp.event_date < @EndDate OR @EndDate IS NULL)
403+
AND (dp.client_app = @AppName OR @AppName IS NULL)
404+
AND (dp.host_name = @HostName OR @HostName IS NULL)
405+
AND (dp.login_name = @LoginName OR @LoginName IS NULL)
384406
GROUP BY DB_NAME(dp.database_id)
385407
OPTION ( RECOMPILE );
386408

@@ -397,6 +419,12 @@ SET @VersionDate = '20180101';
397419
AS finding
398420
FROM #deadlock_process AS dp
399421
WHERE dp.isolation_level LIKE 'repeatable read%'
422+
AND (DB_NAME(dp.database_id) = @DatabaseName OR @DatabaseName IS NULL)
423+
AND (dp.event_date >= @StartDate OR @StartDate IS NULL)
424+
AND (dp.event_date < @EndDate OR @EndDate IS NULL)
425+
AND (dp.client_app = @AppName OR @AppName IS NULL)
426+
AND (dp.host_name = @HostName OR @HostName IS NULL)
427+
AND (dp.login_name = @LoginName OR @LoginName IS NULL)
400428
GROUP BY DB_NAME(dp.database_id)
401429
OPTION ( RECOMPILE );
402430

@@ -417,6 +445,13 @@ SET @VersionDate = '20180101';
417445
ISNULL(dp.host_name, 'UNKNOWN')
418446
AS finding
419447
FROM #deadlock_process AS dp
448+
WHERE 1 = 1
449+
AND (DB_NAME(dp.database_id) = @DatabaseName OR @DatabaseName IS NULL)
450+
AND (dp.event_date >= @StartDate OR @StartDate IS NULL)
451+
AND (dp.event_date < @EndDate OR @EndDate IS NULL)
452+
AND (dp.client_app = @AppName OR @AppName IS NULL)
453+
AND (dp.host_name = @HostName OR @HostName IS NULL)
454+
AND (dp.login_name = @LoginName OR @LoginName IS NULL)
420455
GROUP BY DB_NAME(dp.database_id), dp.login_name, dp.client_app, dp.host_name
421456
OPTION ( RECOMPILE );
422457

@@ -431,6 +466,14 @@ SET @VersionDate = '20180101';
431466
JOIN #deadlock_owner_waiter AS dow
432467
ON dp.id = dow.owner_id
433468
AND dp.event_date = dow.event_date
469+
WHERE 1 = 1
470+
AND (DB_NAME(dp.database_id) = @DatabaseName OR @DatabaseName IS NULL)
471+
AND (dp.event_date >= @StartDate OR @StartDate IS NULL)
472+
AND (dp.event_date < @EndDate OR @EndDate IS NULL)
473+
AND (dp.client_app = @AppName OR @AppName IS NULL)
474+
AND (dp.host_name = @HostName OR @HostName IS NULL)
475+
AND (dp.login_name = @LoginName OR @LoginName IS NULL)
476+
AND (dow.object_name = @ObjectName OR @ObjectName IS NULL)
434477
GROUP BY DB_NAME(dp.database_id), SUBSTRING(dp.wait_resource, 1, CHARINDEX(':', dp.wait_resource) - 1), dow.object_name
435478
)
436479
INSERT #deadlock_findings ( check_id, database_name, object_name, finding_group, finding )
@@ -487,6 +530,11 @@ SET @VersionDate = '20180101';
487530
JOIN #deadlock_owner_waiter AS dow
488531
ON dow.owner_id = ds.id
489532
AND dow.event_date = ds.event_date
533+
WHERE 1 = 1
534+
AND (DB_NAME(dow.database_id) = @DatabaseName OR @DatabaseName IS NULL)
535+
AND (dow.event_date >= @StartDate OR @StartDate IS NULL)
536+
AND (dow.event_date < @EndDate OR @EndDate IS NULL)
537+
AND (dow.object_name = @StoredProcName OR @StoredProcName IS NULL)
490538
OPTION ( RECOMPILE );
491539

492540
IF @ProductVersionMajor >= 13
@@ -520,6 +568,10 @@ SET @VersionDate = '20180101';
520568
ON dow.owner_id = ds.id
521569
AND dow.event_date = ds.event_date
522570
WHERE ds.proc_name <> 'adhoc'
571+
AND (DB_NAME(dow.database_id) = @DatabaseName OR @DatabaseName IS NULL)
572+
AND (dow.event_date >= @StartDate OR @StartDate IS NULL)
573+
AND (dow.event_date < @EndDate OR @EndDate IS NULL)
574+
AND (dow.object_name = @StoredProcName OR @StoredProcName IS NULL)
523575
OPTION ( RECOMPILE );
524576
END;
525577

@@ -542,6 +594,13 @@ SET @VersionDate = '20180101';
542594
ON dp.id = ds.id
543595
AND ds.event_date = dp.event_date
544596
WHERE ds.proc_name <> 'adhoc'
597+
AND (ds.proc_name = @StoredProcName OR @StoredProcName IS NULL)
598+
AND (DB_NAME(dp.database_id) = @DatabaseName OR @DatabaseName IS NULL)
599+
AND (dp.event_date >= @StartDate OR @StartDate IS NULL)
600+
AND (dp.event_date < @EndDate OR @EndDate IS NULL)
601+
AND (dp.client_app = @AppName OR @AppName IS NULL)
602+
AND (dp.host_name = @HostName OR @HostName IS NULL)
603+
AND (dp.login_name = @LoginName OR @LoginName IS NULL)
545604
GROUP BY DB_NAME(dp.database_id), ds.proc_name
546605
OPTION(RECOMPILE);
547606

@@ -554,6 +613,11 @@ SET @VersionDate = '20180101';
554613
PARSENAME(dow.object_name, 2) AS schema_name,
555614
PARSENAME(dow.object_name, 1) AS table_name
556615
FROM #deadlock_owner_waiter AS dow
616+
WHERE 1 = 1
617+
AND (DB_NAME(dow.database_id) = @DatabaseName OR @DatabaseName IS NULL)
618+
AND (dow.event_date >= @StartDate OR @StartDate IS NULL)
619+
AND (dow.event_date < @EndDate OR @EndDate IS NULL)
620+
AND (dow.object_name = @ObjectName OR @ObjectName IS NULL)
557621
)
558622
INSERT #deadlock_findings ( check_id, database_name, object_name, finding_group, finding )
559623
SELECT 9 AS check_id,
@@ -579,6 +643,14 @@ SET @VersionDate = '20180101';
579643
JOIN #deadlock_process AS dp
580644
ON (dp.id = dow.owner_id OR dp.victim_id = dow.waiter_id)
581645
AND dp.event_date = dow.event_date
646+
WHERE 1 = 1
647+
AND (DB_NAME(dow.database_id) = @DatabaseName OR @DatabaseName IS NULL)
648+
AND (dow.event_date >= @StartDate OR @StartDate IS NULL)
649+
AND (dow.event_date < @EndDate OR @EndDate IS NULL)
650+
AND (dow.object_name = @ObjectName OR @ObjectName IS NULL)
651+
AND (dp.client_app = @AppName OR @AppName IS NULL)
652+
AND (dp.host_name = @HostName OR @HostName IS NULL)
653+
AND (dp.login_name = @LoginName OR @LoginName IS NULL)
582654
GROUP BY PARSENAME(dow.object_name, 3), dow.object_name
583655
)
584656
INSERT #deadlock_findings ( check_id, database_name, object_name, finding_group, finding )
@@ -599,6 +671,13 @@ SET @VersionDate = '20180101';
599671
SELECT DB_NAME(dp.database_id) AS database_name,
600672
SUM(CONVERT(BIGINT, dp.wait_time)) AS total_wait_time_ms
601673
FROM #deadlock_process AS dp
674+
WHERE 1 = 1
675+
AND (DB_NAME(dp.database_id) = @DatabaseName OR @DatabaseName IS NULL)
676+
AND (dp.event_date >= @StartDate OR @StartDate IS NULL)
677+
AND (dp.event_date < @EndDate OR @EndDate IS NULL)
678+
AND (dp.client_app = @AppName OR @AppName IS NULL)
679+
AND (dp.host_name = @HostName OR @HostName IS NULL)
680+
AND (dp.login_name = @LoginName OR @LoginName IS NULL)
602681
GROUP BY DB_NAME(dp.database_id)
603682
)
604683
INSERT #deadlock_findings ( check_id, database_name, object_name, finding_group, finding )
@@ -727,7 +806,15 @@ SET @VersionDate = '20180101';
727806
d.transaction_name
728807
FROM deadlocks AS d
729808
WHERE d.dn = 1
730-
ORDER BY d.event_date, is_victim DESC;
809+
AND (DB_NAME(d.database_id) = @DatabaseName OR @DatabaseName IS NULL)
810+
AND (d.event_date >= @StartDate OR @StartDate IS NULL)
811+
AND (d.event_date < @EndDate OR @EndDate IS NULL)
812+
AND (CONVERT(NVARCHAR(MAX), d.object_names) LIKE '%' + @ObjectName + '%' OR @ObjectName IS NULL)
813+
AND (d.client_app = @AppName OR @AppName IS NULL)
814+
AND (d.host_name = @HostName OR @HostName IS NULL)
815+
AND (d.login_name = @LoginName OR @LoginName IS NULL)
816+
ORDER BY d.event_date, is_victim DESC
817+
OPTION ( RECOMPILE );
731818

732819

733820

0 commit comments

Comments
 (0)