Skip to content

Commit 61e5506

Browse files
sp_BlitzCache: fix 16 bugs found in code review
CRITICAL: - Line 2397: max_worker_time used instead of max_elapsed_time for statement-level queries — showed CPU time as elapsed duration HIGH (5 AND/OR precedence bugs): - Line 4883: bitmask & 8192 = 8191 always false — NUMERIC_ROUNDABORT never detected, fixed to = 8192 - Lines 4904-4906: cursor detection SPID filter bypassed - Lines 4276-4278: variable JOIN cross-joined adhoc queries - Lines 4530-4535: missing index check SPID filter bypassed - Lines 5108-5109: "No warnings" update SPID filter bypassed MEDIUM: - Line 2021: OR instead of AND in @DatabaseName null/empty check — empty string silently returned zero results - Line 6036: /1000/1000 double division displayed "0 second(s)" instead of "300 second(s)" for long running query warning - Lines 6560-6774: 15 findings checks (CheckIDs 54-68) missing AND SPID = @@spid — concurrent sessions saw each other's data - Line 6293: CheckID 33 vs 34 mismatch for is_table_variable - Lines 3061-3065: missing SPID filter on grouped percentage UPDATE LOW: - Lines 2622-2631: SUBSTRING debug prints overlapping output - Line 4338: NCHAR(10) misplaced inside ELSE for QUOTED_IDENTIFIER - Line 2278: missing divide-by-zero guard on PercentExecutionsByType - Line 1082: @renalyze typo in error message - Line 4335: extra leading space in ARITHABORT OFF Tested all 6 execution modes on sql2022 — all pass. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2422c4b commit 61e5506

1 file changed

Lines changed: 55 additions & 52 deletions

File tree

‎sp_BlitzCache.sql‎

Lines changed: 55 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,7 @@ IF @Top IS NULL
10791079
OR @QueryFilter IS NULL
10801080
OR @Reanalyze IS NULL
10811081
BEGIN
1082-
RAISERROR(N'Several parameters (@Top, @SortOrder, @QueryFilter, @renalyze) are required. Do not set them to NULL. Please try again.', 16, 1) WITH NOWAIT;
1082+
RAISERROR(N'Several parameters (@Top, @SortOrder, @QueryFilter, @Reanalyze) are required. Do not set them to NULL. Please try again.', 16, 1) WITH NOWAIT;
10831083
RETURN;
10841084
END;
10851085

@@ -2018,7 +2018,7 @@ IF @IgnoreSystemDBs = 1
20182018
SET @body += N' AND COALESCE(LOWER(DB_NAME(CAST(xpa.value AS INT))), '''') NOT IN (''master'', ''model'', ''msdb'', ''tempdb'', ''32767'', ''dbmaintenance'', ''dbadmin'', ''dbatools'') AND COALESCE(DB_NAME(CAST(xpa.value AS INT)), '''') NOT IN (SELECT name FROM sys.databases WHERE is_distributor = 1)' + @nl ;
20192019
END;
20202020

2021-
IF @DatabaseName IS NOT NULL OR @DatabaseName <> N''
2021+
IF @DatabaseName IS NOT NULL AND @DatabaseName <> N''
20222022
BEGIN
20232023
RAISERROR(N'Filtering database name chosen', 0, 1) WITH NOWAIT;
20242024
SET @body += N' AND CAST(xpa.value AS BIGINT) = DB_ID(N'
@@ -2275,7 +2275,9 @@ BEGIN
22752275
CASE WHEN t.t_TotalReads = 0 THEN 0
22762276
ELSE CAST(ROUND(100.00 * total_logical_reads / t.t_TotalReads, 2) AS MONEY)
22772277
END AS PercentReadsByType,
2278-
CAST(ROUND(100.00 * execution_count / t.t_TotalExecs, 2) AS MONEY) AS PercentExecutionsByType,
2278+
CASE WHEN t.t_TotalExecs = 0 THEN 0
2279+
ELSE CAST(ROUND(100.00 * execution_count / t.t_TotalExecs, 2) AS MONEY)
2280+
END AS PercentExecutionsByType,
22792281
(total_elapsed_time / 1000.0) / execution_count AS AvgDuration ,
22802282
(total_elapsed_time / 1000.0) AS TotalDuration ,
22812283
total_logical_reads / execution_count AS AvgReads ,
@@ -2394,7 +2396,7 @@ BEGIN
23942396
qs.max_worker_time / 1000.0,
23952397
CASE WHEN qp.query_plan.value(''declare namespace p="http://schemas.microsoft.com/sqlserver/2004/07/showplan";max(//p:RelOp/@Parallel)'', ''float'') > 0 THEN 1 ELSE 0 END,
23962398
qs.min_elapsed_time / 1000.0,
2397-
qs.max_worker_time / 1000.0,
2399+
qs.max_elapsed_time / 1000.0,
23982400
age_minutes,
23992401
age_minutes_lifetime,
24002402
@SortOrder ';
@@ -2619,16 +2621,16 @@ SELECT @sql = REPLACE(@sql, '#sortable#', @sort);
26192621
IF @Debug = 1
26202622
BEGIN
26212623
PRINT N'Printing dynamic SQL stored in @sql: ';
2622-
PRINT SUBSTRING(@sql, 0, 4000);
2623-
PRINT SUBSTRING(@sql, 4000, 8000);
2624-
PRINT SUBSTRING(@sql, 8000, 12000);
2625-
PRINT SUBSTRING(@sql, 12000, 16000);
2626-
PRINT SUBSTRING(@sql, 16000, 20000);
2627-
PRINT SUBSTRING(@sql, 20000, 24000);
2628-
PRINT SUBSTRING(@sql, 24000, 28000);
2629-
PRINT SUBSTRING(@sql, 28000, 32000);
2630-
PRINT SUBSTRING(@sql, 32000, 36000);
2631-
PRINT SUBSTRING(@sql, 36000, 40000);
2624+
PRINT SUBSTRING(@sql, 1, 4000);
2625+
PRINT SUBSTRING(@sql, 4001, 4000);
2626+
PRINT SUBSTRING(@sql, 8001, 4000);
2627+
PRINT SUBSTRING(@sql, 12001, 4000);
2628+
PRINT SUBSTRING(@sql, 16001, 4000);
2629+
PRINT SUBSTRING(@sql, 20001, 4000);
2630+
PRINT SUBSTRING(@sql, 24001, 4000);
2631+
PRINT SUBSTRING(@sql, 28001, 4000);
2632+
PRINT SUBSTRING(@sql, 32001, 4000);
2633+
PRINT SUBSTRING(@sql, 36001, 4000);
26322634
END;
26332635

26342636
RAISERROR(N'Creating temp tables for results and warnings.', 0, 1) WITH NOWAIT;
@@ -3062,6 +3064,7 @@ WHERE ##BlitzCacheProcs.SqlHandle = y.SqlHandle
30623064
AND ##BlitzCacheProcs.QueryHash = y.QueryHash
30633065
AND ##BlitzCacheProcs.DatabaseName = y.DatabaseName
30643066
AND ##BlitzCacheProcs.PlanHandle IS NULL
3067+
AND ##BlitzCacheProcs.SPID = @@SPID
30653068
OPTION (RECOMPILE) ;
30663069

30673070

@@ -4273,8 +4276,8 @@ SET sp.variable_datatype = vi.variable_datatype,
42734276
sp.compile_time_value = vi.compile_time_value
42744277
FROM #stored_proc_info AS sp
42754278
JOIN #variable_info AS vi
4276-
ON (sp.proc_name = 'adhoc' AND sp.QueryHash = vi.QueryHash)
4277-
OR (sp.proc_name <> 'adhoc' AND sp.SqlHandle = vi.SqlHandle)
4279+
ON ((sp.proc_name = 'adhoc' AND sp.QueryHash = vi.QueryHash)
4280+
OR (sp.proc_name <> 'adhoc' AND sp.SqlHandle = vi.SqlHandle))
42784281
AND sp.variable_name = vi.variable_name
42794282
OPTION (RECOMPILE);
42804283

@@ -4332,10 +4335,10 @@ JOIN (
43324335
N'SET ANSI_NULLS ' + CASE WHEN [ANSI_NULLS] = 'true' THEN N'ON ' ELSE N'OFF ' END + NCHAR(10) +
43334336
N'SET ANSI_PADDING ' + CASE WHEN [ANSI_PADDING] = 'true' THEN N'ON ' ELSE N'OFF ' END + NCHAR(10) +
43344337
N'SET ANSI_WARNINGS ' + CASE WHEN [ANSI_WARNINGS] = 'true' THEN N'ON ' ELSE N'OFF ' END + NCHAR(10) +
4335-
N'SET ARITHABORT ' + CASE WHEN [ARITHABORT] = 'true' THEN N'ON ' ELSE N' OFF ' END + NCHAR(10) +
4338+
N'SET ARITHABORT ' + CASE WHEN [ARITHABORT] = 'true' THEN N'ON ' ELSE N'OFF ' END + NCHAR(10) +
43364339
N'SET CONCAT_NULL_YIELDS_NULL ' + CASE WHEN [CONCAT_NULL_YIELDS_NULL] = 'true' THEN N'ON ' ELSE N'OFF ' END + NCHAR(10) +
43374340
N'SET NUMERIC_ROUNDABORT ' + CASE WHEN [NUMERIC_ROUNDABORT] = 'true' THEN N'ON ' ELSE N'OFF ' END + NCHAR(10) +
4338-
N'SET QUOTED_IDENTIFIER ' + CASE WHEN [QUOTED_IDENTIFIER] = 'true' THEN N'ON ' ELSE N'OFF ' + NCHAR(10) END AS [ansi_set_options]
4341+
N'SET QUOTED_IDENTIFIER ' + CASE WHEN [QUOTED_IDENTIFIER] = 'true' THEN N'ON ' ELSE N'OFF ' END + NCHAR(10) AS [ansi_set_options]
43394342
FROM (
43404343
SELECT
43414344
s.SqlHandle,
@@ -4529,9 +4532,9 @@ OPTION (RECOMPILE);
45294532
/*Begin Missing Index*/
45304533
IF EXISTS ( SELECT 1/0
45314534
FROM ##BlitzCacheProcs AS bbcp
4532-
WHERE bbcp.missing_index_count > 0
4535+
WHERE (bbcp.missing_index_count > 0
45334536
OR bbcp.index_spool_cost > 0
4534-
OR bbcp.index_spool_rows > 0
4537+
OR bbcp.index_spool_rows > 0)
45354538
AND bbcp.SPID = @@SPID )
45364539

45374540
BEGIN
@@ -4880,7 +4883,7 @@ UPDATE p
48804883
CASE WHEN (CAST(pa.value AS INT) & 32 = 32) THEN ', ANSI_NULLS' ELSE '' END +
48814884
CASE WHEN (CAST(pa.value AS INT) & 64 = 64) THEN ', QUOTED_IDENTIFIER' ELSE '' END +
48824885
CASE WHEN (CAST(pa.value AS INT) & 4096 = 4096) THEN ', ARITH_ABORT' ELSE '' END +
4883-
CASE WHEN (CAST(pa.value AS INT) & 8192 = 8191) THEN ', NUMERIC_ROUNDABORT' ELSE '' END
4886+
CASE WHEN (CAST(pa.value AS INT) & 8192 = 8192) THEN ', NUMERIC_ROUNDABORT' ELSE '' END
48844887
, 2, 200000)
48854888
FROM ##BlitzCacheProcs p
48864889
CROSS APPLY sys.dm_exec_plan_attributes(p.PlanHandle) pa
@@ -4901,8 +4904,8 @@ OPTION (RECOMPILE);
49014904
UPDATE p
49024905
SET is_cursor = 1
49034906
FROM ##BlitzCacheProcs p
4904-
WHERE QueryHash = 0x0000000000000000
4905-
OR QueryPlanHash = 0x0000000000000000
4907+
WHERE (QueryHash = 0x0000000000000000
4908+
OR QueryPlanHash = 0x0000000000000000)
49064909
AND SPID = @@SPID
49074910
OPTION (RECOMPILE);
49084911

@@ -5105,7 +5108,7 @@ SET Warnings = 'No warnings detected. ' + CASE @ExpertMode
51055108
THEN ' Try running sp_BlitzCache with @ExpertMode = 1 to find more advanced problems.'
51065109
ELSE ''
51075110
END
5108-
WHERE Warnings = '' OR Warnings IS NULL
5111+
WHERE (Warnings = '' OR Warnings IS NULL)
51095112
AND SPID = @@SPID
51105113
OPTION (RECOMPILE);
51115114

@@ -5757,16 +5760,16 @@ SET @sql += N' OPTION (RECOMPILE) ; ';
57575760

57585761
IF @Debug = 1
57595762
BEGIN
5760-
PRINT SUBSTRING(@sql, 0, 4000);
5761-
PRINT SUBSTRING(@sql, 4000, 8000);
5762-
PRINT SUBSTRING(@sql, 8000, 12000);
5763-
PRINT SUBSTRING(@sql, 12000, 16000);
5764-
PRINT SUBSTRING(@sql, 16000, 20000);
5765-
PRINT SUBSTRING(@sql, 20000, 24000);
5766-
PRINT SUBSTRING(@sql, 24000, 28000);
5767-
PRINT SUBSTRING(@sql, 28000, 32000);
5768-
PRINT SUBSTRING(@sql, 32000, 36000);
5769-
PRINT SUBSTRING(@sql, 36000, 40000);
5763+
PRINT SUBSTRING(@sql, 1, 4000);
5764+
PRINT SUBSTRING(@sql, 4001, 4000);
5765+
PRINT SUBSTRING(@sql, 8001, 4000);
5766+
PRINT SUBSTRING(@sql, 12001, 4000);
5767+
PRINT SUBSTRING(@sql, 16001, 4000);
5768+
PRINT SUBSTRING(@sql, 20001, 4000);
5769+
PRINT SUBSTRING(@sql, 24001, 4000);
5770+
PRINT SUBSTRING(@sql, 28001, 4000);
5771+
PRINT SUBSTRING(@sql, 32001, 4000);
5772+
PRINT SUBSTRING(@sql, 36001, 4000);
57705773
END;
57715774
IF(@OutputType <> 'NONE')
57725775
BEGIN
@@ -6033,7 +6036,7 @@ BEGIN
60336036
'Long Running Query',
60346037
'https://www.brentozar.com/blitzcache/long-running-queries/',
60356038
'Long running queries have been found. These are queries with an average duration longer than '
6036-
+ CAST(@long_running_query_warning_seconds / 1000 / 1000 AS VARCHAR(5))
6039+
+ CAST(@long_running_query_warning_seconds / 1000 AS VARCHAR(5))
60376040
+ ' second(s). These queries should be investigated for additional tuning options.') ;
60386041

60396042
IF EXISTS (SELECT 1/0
@@ -6290,7 +6293,7 @@ BEGIN
62906293
AND SPID = @@SPID)
62916294
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
62926295
VALUES (@@SPID,
6293-
33,
6296+
34,
62946297
100,
62956298
'Table Variables detected',
62966299
'Table Variables',
@@ -6560,7 +6563,7 @@ BEGIN
65606563
IF EXISTS (SELECT 1/0
65616564
FROM ##BlitzCacheProcs p
65626565
WHERE p.is_spool_expensive = 1
6563-
)
6566+
AND p.SPID = @@SPID)
65646567
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
65656568
VALUES (@@SPID,
65666569
54,
@@ -6573,7 +6576,7 @@ BEGIN
65736576
IF EXISTS (SELECT 1/0
65746577
FROM ##BlitzCacheProcs p
65756578
WHERE p.is_spool_more_rows = 1
6576-
)
6579+
AND p.SPID = @@SPID)
65776580
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
65786581
VALUES (@@SPID,
65796582
55,
@@ -6586,7 +6589,7 @@ BEGIN
65866589
IF EXISTS (SELECT 1/0
65876590
FROM ##BlitzCacheProcs p
65886591
WHERE p.is_bad_estimate = 1
6589-
)
6592+
AND p.SPID = @@SPID)
65906593
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
65916594
VALUES (@@SPID,
65926595
56,
@@ -6599,7 +6602,7 @@ BEGIN
65996602
IF EXISTS (SELECT 1/0
66006603
FROM ##BlitzCacheProcs p
66016604
WHERE p.is_paul_white_electric = 1
6602-
)
6605+
AND p.SPID = @@SPID)
66036606
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
66046607
VALUES (@@SPID,
66056608
57,
@@ -6629,7 +6632,7 @@ BEGIN
66296632
IF EXISTS (SELECT 1/0
66306633
FROM ##BlitzCacheProcs p
66316634
WHERE p.is_row_goal = 1
6632-
)
6635+
AND p.SPID = @@SPID)
66336636
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
66346637
VALUES (@@SPID,
66356638
58,
@@ -6642,7 +6645,7 @@ BEGIN
66426645
IF EXISTS (SELECT 1/0
66436646
FROM ##BlitzCacheProcs p
66446647
WHERE p.is_big_spills = 1
6645-
)
6648+
AND p.SPID = @@SPID)
66466649
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
66476650
VALUES (@@SPID,
66486651
59,
@@ -6658,7 +6661,7 @@ BEGIN
66586661
IF EXISTS (SELECT 1/0
66596662
FROM ##BlitzCacheProcs p
66606663
WHERE p.is_mstvf = 1
6661-
)
6664+
AND p.SPID = @@SPID)
66626665
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
66636666
VALUES (@@SPID,
66646667
60,
@@ -6671,7 +6674,7 @@ BEGIN
66716674
IF EXISTS (SELECT 1/0
66726675
FROM ##BlitzCacheProcs p
66736676
WHERE p.is_mm_join = 1
6674-
)
6677+
AND p.SPID = @@SPID)
66756678
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
66766679
VALUES (@@SPID,
66776680
61,
@@ -6684,7 +6687,7 @@ BEGIN
66846687
IF EXISTS (SELECT 1/0
66856688
FROM ##BlitzCacheProcs p
66866689
WHERE p.is_nonsargable = 1
6687-
)
6690+
AND p.SPID = @@SPID)
66886691
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
66896692
VALUES (@@SPID,
66906693
62,
@@ -6697,7 +6700,7 @@ BEGIN
66976700
IF EXISTS (SELECT 1/0
66986701
FROM ##BlitzCacheProcs p
66996702
WHERE CompileTime > 5000
6700-
)
6703+
AND p.SPID = @@SPID)
67016704
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
67026705
VALUES (@@SPID,
67036706
63,
@@ -6710,7 +6713,7 @@ BEGIN
67106713
IF EXISTS (SELECT 1/0
67116714
FROM ##BlitzCacheProcs p
67126715
WHERE CompileCPU > 5000
6713-
)
6716+
AND p.SPID = @@SPID)
67146717
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
67156718
VALUES (@@SPID,
67166719
64,
@@ -6722,9 +6725,9 @@ BEGIN
67226725

67236726
IF EXISTS (SELECT 1/0
67246727
FROM ##BlitzCacheProcs p
6725-
WHERE CompileMemory > 1024
6728+
WHERE CompileMemory > 1024
67266729
AND ((CompileMemory) / (1 * CASE WHEN MaxCompileMemory = 0 THEN 1 ELSE MaxCompileMemory END) * 100.) >= 10.
6727-
)
6730+
AND p.SPID = @@SPID)
67286731
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
67296732
VALUES (@@SPID,
67306733
65,
@@ -6737,7 +6740,7 @@ BEGIN
67376740
IF EXISTS (SELECT 1/0
67386741
FROM ##BlitzCacheProcs p
67396742
WHERE p.select_with_writes = 1
6740-
)
6743+
AND p.SPID = @@SPID)
67416744
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
67426745
VALUES (@@SPID,
67436746
66,
@@ -6750,7 +6753,7 @@ BEGIN
67506753
IF EXISTS (SELECT 1/0
67516754
FROM ##BlitzCacheProcs p
67526755
WHERE p.is_table_spool_expensive = 1
6753-
)
6756+
AND p.SPID = @@SPID)
67546757
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
67556758
VALUES (@@SPID,
67566759
67,
@@ -6763,7 +6766,7 @@ BEGIN
67636766
IF EXISTS (SELECT 1/0
67646767
FROM ##BlitzCacheProcs p
67656768
WHERE p.is_table_spool_more_rows = 1
6766-
)
6769+
AND p.SPID = @@SPID)
67676770
INSERT INTO ##BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
67686771
VALUES (@@SPID,
67696772
68,

0 commit comments

Comments
 (0)