Skip to content

Commit 8889090

Browse files
authored
Merge pull request BrentOzarULTD#867 from BrentOzarULTD/sp_BlitzCache_ErikSpecial
Sp blitzcache erikspecial
2 parents 10192af + e5c9676 commit 8889090

File tree

1 file changed

+52
-43
lines changed

1 file changed

+52
-43
lines changed

sp_BlitzCache.sql

Lines changed: 52 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,23 +1035,25 @@ CREATE TABLE #configuration (
10351035

10361036
RAISERROR(N'Checking plan cache age', 0, 1) WITH NOWAIT;
10371037
WITH x AS (
1038-
SELECT SUM(CASE WHEN DATEDIFF(HOUR, deqs.creation_time, SYSDATETIME()) < 24 THEN 1 ELSE 0 END) AS [plans_24],
1039-
SUM(CASE WHEN DATEDIFF(HOUR, deqs.creation_time, SYSDATETIME()) < 4 THEN 1 ELSE 0 END) AS [plans_4],
1038+
SELECT SUM(CASE WHEN DATEDIFF(HOUR, deqs.creation_time, SYSDATETIME()) <= 24 THEN 1 ELSE 0 END) AS [plans_24],
1039+
SUM(CASE WHEN DATEDIFF(HOUR, deqs.creation_time, SYSDATETIME()) <= 4 THEN 1 ELSE 0 END) AS [plans_4],
1040+
SUM(CASE WHEN DATEDIFF(HOUR, deqs.creation_time, SYSDATETIME()) <= 1 THEN 1 ELSE 0 END) AS [plans_1],
10401041
COUNT(deqs.creation_time) AS [total_plans]
10411042
FROM sys.dm_exec_query_stats AS deqs
10421043
)
1043-
SELECT CONVERT(DECIMAL(3,2), x.plans_24 / (1. * NULLIF(x.total_plans, 0))) * 100 AS [percent_24],
1044-
CONVERT(DECIMAL(3,2), x.plans_4 / (1. * NULLIF(x.total_plans, 0))) * 100 AS [percent_4],
1044+
SELECT CONVERT(DECIMAL(3,2), NULLIF(x.plans_24, 0) / (1. * NULLIF(x.total_plans, 0))) * 100 AS [percent_24],
1045+
CONVERT(DECIMAL(3,2), NULLIF(x.plans_4 , 0) / (1. * NULLIF(x.total_plans, 0))) * 100 AS [percent_4],
1046+
CONVERT(DECIMAL(3,2), NULLIF(x.plans_1 , 0) / (1. * NULLIF(x.total_plans, 0))) * 100 AS [percent_1],
10451047
@@SPID AS SPID
10461048
INTO #plan_creation
10471049
FROM x
10481050
OPTION (RECOMPILE) ;
10491051

10501052

10511053
RAISERROR(N'Checking plan stub count', 0, 1) WITH NOWAIT;
1052-
SELECT CONVERT(DECIMAL(9, 2), ( CAST(COUNT(*) AS DECIMAL(9, 2)) / ( SELECT COUNT (*) FROM sys.dm_exec_cached_plans ) )) AS plan_stubs_percent,
1054+
SELECT CONVERT(DECIMAL(9, 2), (CAST(NULLIF(COUNT(*), 0) AS DECIMAL(9, 2)) / ( SELECT COUNT (*) FROM sys.dm_exec_cached_plans ) )) AS plan_stubs_percent,
10531055
COUNT(*) AS total_plan_stubs,
1054-
( SELECT COUNT (*) FROM sys.dm_exec_cached_plans ) AS total_plans,
1056+
(SELECT COUNT (*) FROM sys.dm_exec_cached_plans) AS total_plans,
10551057
ISNULL(AVG(DATEDIFF(HOUR, qs.creation_time, GETDATE())), 0) AS avg_plan_age,
10561058
@@SPID AS SPID
10571059
INTO #plan_stubs_warning
@@ -1063,9 +1065,9 @@ OPTION (RECOMPILE) ;
10631065

10641066

10651067
RAISERROR(N'Checking single use plan count', 0, 1) WITH NOWAIT;
1066-
SELECT CONVERT(DECIMAL(9, 2), ( CAST(COUNT(*) AS DECIMAL(9, 2)) / ( SELECT COUNT (*) FROM sys.dm_exec_cached_plans ) )) AS single_use_plans_percent,
1068+
SELECT CONVERT(DECIMAL(9, 2), (CAST(NULLIF(COUNT(*), 0) AS DECIMAL(9, 2)) / ( SELECT COUNT (*) FROM sys.dm_exec_cached_plans ) )) AS single_use_plans_percent,
10671069
COUNT(*) AS total_single_use_plans,
1068-
( SELECT COUNT (*) FROM sys.dm_exec_cached_plans ) AS total_plans,
1070+
(SELECT COUNT (*) FROM sys.dm_exec_cached_plans) AS total_plans,
10691071
ISNULL(AVG(DATEDIFF(HOUR, qs.creation_time, GETDATE())), 0) AS avg_plan_age,
10701072
@@SPID AS SPID
10711073
INTO #single_use_plans_warning
@@ -2218,16 +2220,6 @@ FROM ##bou_BlitzCacheProcs b
22182220
WHERE b.QueryPlanCost IS NULL
22192221
OPTION (RECOMPILE);
22202222

2221-
RAISERROR(N'Checking for forced serialization', 0, 1) WITH NOWAIT;
2222-
WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
2223-
UPDATE ##bou_BlitzCacheProcs
2224-
SET is_forced_serial = 1
2225-
FROM #query_plan qp
2226-
WHERE qp.SqlHandle = ##bou_BlitzCacheProcs.SqlHandle
2227-
AND SPID = @@SPID
2228-
AND query_plan.exist('/p:QueryPlan/@NonParallelPlanReason') = 1
2229-
OPTION (RECOMPILE);
2230-
22312223
RAISERROR(N'Checking for plan warnings', 0, 1) WITH NOWAIT;
22322224
WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
22332225
UPDATE ##bou_BlitzCacheProcs
@@ -2426,22 +2418,6 @@ WHERE SPID = @@SPID
24262418
OPTION (RECOMPILE) ;
24272419

24282420

2429-
RAISERROR(N'Checking for ColumnStore queries operating in Row Mode instead of Batch Mode', 0, 1) WITH NOWAIT;
2430-
WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
2431-
UPDATE ##bou_BlitzCacheProcs
2432-
SET columnstore_row_mode = x.is_row_mode
2433-
FROM (
2434-
SELECT
2435-
qs.SqlHandle,
2436-
relop.exist('/p:RelOp[(@EstimatedExecutionMode[.="Row"])]') AS is_row_mode
2437-
FROM #relop qs
2438-
WHERE [relop].exist('/p:RelOp/p:IndexScan[(@Storage[.="ColumnStore"])]') = 1
2439-
) AS x
2440-
WHERE ##bou_BlitzCacheProcs.SqlHandle = x.SqlHandle
2441-
AND SPID = @@SPID
2442-
OPTION (RECOMPILE) ;
2443-
2444-
24452421
RAISERROR(N'Checking for computed columns that reference scalar UDFs', 0, 1) WITH NOWAIT;
24462422
WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
24472423
UPDATE ##bou_BlitzCacheProcs
@@ -2541,6 +2517,37 @@ WHERE ##bou_BlitzCacheProcs.SqlHandle = x.SqlHandle
25412517
AND SPID = @@SPID
25422518
OPTION (RECOMPILE);
25432519

2520+
IF @v >= 11
2521+
BEGIN
2522+
2523+
RAISERROR(N'Checking for forced serialization', 0, 1) WITH NOWAIT;
2524+
WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
2525+
UPDATE ##bou_BlitzCacheProcs
2526+
SET is_forced_serial = 1
2527+
FROM #query_plan qp
2528+
WHERE qp.SqlHandle = ##bou_BlitzCacheProcs.SqlHandle
2529+
AND SPID = @@SPID
2530+
AND query_plan.exist('/p:QueryPlan/@NonParallelPlanReason') = 1
2531+
OPTION (RECOMPILE);
2532+
2533+
2534+
RAISERROR(N'Checking for ColumnStore queries operating in Row Mode instead of Batch Mode', 0, 1) WITH NOWAIT;
2535+
WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
2536+
UPDATE ##bou_BlitzCacheProcs
2537+
SET columnstore_row_mode = x.is_row_mode
2538+
FROM (
2539+
SELECT
2540+
qs.SqlHandle,
2541+
relop.exist('/p:RelOp[(@EstimatedExecutionMode[.="Row"])]') AS is_row_mode
2542+
FROM #relop qs
2543+
WHERE [relop].exist('/p:RelOp/p:IndexScan[(@Storage[.="ColumnStore"])]') = 1
2544+
) AS x
2545+
WHERE ##bou_BlitzCacheProcs.SqlHandle = x.SqlHandle
2546+
AND SPID = @@SPID
2547+
OPTION (RECOMPILE) ;
2548+
2549+
END
2550+
25442551
IF @v >= 12
25452552
BEGIN
25462553
RAISERROR('Checking for downlevel cardinality estimators being used on SQL Server 2014.', 0, 1) WITH NOWAIT;
@@ -2619,6 +2626,8 @@ AND SPID = @@SPID
26192626
OPTION (RECOMPILE) ;
26202627

26212628
/* Trace Flag Checks 2014 SP2 and 2016 SP1 only)*/
2629+
IF @v >= 11
2630+
BEGIN
26222631
RAISERROR(N'Trace flag checks', 0, 1) WITH NOWAIT;
26232632
;WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
26242633
, tf_pretty AS (
@@ -2656,6 +2665,7 @@ FROM ##bou_BlitzCacheProcs p
26562665
JOIN #trace_flags tf ON tf.QueryHash = p.QueryHash
26572666
WHERE SPID = @@SPID
26582667
OPTION(RECOMPILE);
2668+
END
26592669

26602670
IF @SkipAnalysis = 1
26612671
BEGIN
@@ -3244,6 +3254,7 @@ END
32443254
ELSE
32453255
BEGIN
32463256
SET @columns = N' DatabaseName AS [Database],
3257+
QueryPlanCost AS [Cost],
32473258
QueryText AS [Query Text],
32483259
QueryType AS [Query Type],
32493260
Warnings AS [Warnings], ' + @nl
@@ -3252,7 +3263,6 @@ BEGIN
32523263
BEGIN
32533264
RAISERROR(N'Returning Expert Mode = 2', 0, 1) WITH NOWAIT;
32543265
SET @columns += N'
3255-
CASE WHEN QueryPlan IS NULL THEN ''We couldn''''t find a plan for this query. Possible reasons for this include dynamic SQL, RECOMPILE hints, and encrypted code.'' ELSE
32563266
SUBSTRING(
32573267
CASE WHEN warning_no_join_predicate = 1 THEN '', 20'' ELSE '''' END +
32583268
CASE WHEN compile_timeout = 1 THEN '', 18'' ELSE '''' END +
@@ -3281,7 +3291,7 @@ BEGIN
32813291
CASE WHEN is_remote_query_expensive = 1 THEN '', 28'' ELSE '''' END +
32823292
CASE WHEN trace_flags_session IS NOT NULL THEN '', 29'' ELSE '''' END +
32833293
CASE WHEN is_unused_grant = 1 THEN '', 30'' ELSE '''' END +
3284-
CASE WHEN function_count > 0 IS NOT NULL THEN '', 31'' ELSE '''' END +
3294+
CASE WHEN function_count > 0 THEN '', 31'' ELSE '''' END +
32853295
CASE WHEN clr_function_count > 0 THEN '', 32'' ELSE '''' END +
32863296
CASE WHEN PlanCreationTimeHours <= 4 THEN '', 33'' ELSE '''' END +
32873297
CASE WHEN is_table_variable = 1 THEN '', 34'' ELSE '''' END +
@@ -3291,8 +3301,8 @@ BEGIN
32913301
CASE WHEN backwards_scan = 1 THEN '', 38'' ELSE '''' END +
32923302
CASE WHEN forced_index = 1 THEN '', 39'' ELSE '''' END +
32933303
CASE WHEN forced_seek = 1 OR forced_scan = 1 THEN '', 40'' ELSE '''' END +
3294-
CASE WHEN columnstore_row_mode = 1 THEN '', 41 '' ELSE '' END +
3295-
CASE WHEN is_computed_scalar = 1 THEN '', 42 '' ELSE '' END +
3304+
CASE WHEN columnstore_row_mode = 1 THEN '', 41'' ELSE '''' END +
3305+
CASE WHEN is_computed_scalar = 1 THEN '', 42'' ELSE '''' END +
32963306
CASE WHEN is_sort_expensive = 1 THEN '', 43'' ELSE '''' END +
32973307
CASE WHEN is_computed_filter = 1 THEN '', 44'' ELSE '''' END +
32983308
CASE WHEN index_ops >= 5 THEN '', 45'' ELSE '''' END +
@@ -3301,8 +3311,8 @@ BEGIN
33013311
CASE WHEN index_dml = 1 THEN '', 48'' ELSE '''' END +
33023312
CASE WHEN table_dml = 1 THEN '', 49'' ELSE '''' END +
33033313
CASE WHEN long_running_low_cpu = 1 THEN '', 50'' ELSE '''' END +
3304-
CASE WHEN low_cost_high_cpu = 1 THEN '', 51, '' ELSE '''' END
3305-
, 2, 200000) END AS opserver_warning , ' + @nl ;
3314+
CASE WHEN low_cost_high_cpu = 1 THEN '', 51'' ELSE '''' END
3315+
, 2, 200000) AS opserver_warning , ' + @nl ;
33063316
END
33073317

33083318
SET @columns += N' ExecutionCount AS [# Executions],
@@ -3340,7 +3350,6 @@ BEGIN
33403350
NumberOfDistinctPlans AS [# Distinct Plans],
33413351
PlanCreationTime AS [Created At],
33423352
LastExecutionTime AS [Last Execution],
3343-
QueryPlanCost AS [Query Plan Cost],
33443353
QueryPlan AS [Query Plan],
33453354
CachedPlanSize AS [Cached Plan Size (KB)],
33463355
CompileTime AS [Compile Time (ms)],
@@ -4029,14 +4038,14 @@ BEGIN
40294038

40304039
IF EXISTS (SELECT 1/0
40314040
FROM #plan_creation p
4032-
WHERE (p.percent_24 > 0 OR p.percent_4 > 0)
4041+
WHERE (p.percent_24 > 0)
40334042
AND SPID = @@SPID)
40344043
INSERT INTO ##bou_BlitzCacheResults (SPID, CheckID, Priority, FindingsGroup, Finding, URL, Details)
40354044
SELECT SPID,
40364045
999,
40374046
254,
40384047
'Plan Cache Information',
4039-
'You have ' + CONVERT(NVARCHAR(10), p.percent_24) + '% plans created in the past 24 hours, and ' + CONVERT(NVARCHAR(10), p.percent_4) + '% created in the past 4 hours.',
4048+
'You have ' + CONVERT(NVARCHAR(10), p.percent_24) + '% plans created in the past 24 hours, ' + CONVERT(NVARCHAR(10), p.percent_4) + '% created in the past 4 hours, and ' + CONVERT(NVARCHAR(10), p.percent_1) + '% created in the past 1 hour.',
40404049
'',
40414050
'If these percentages are high, it may be a sign of memory pressure or plan cache instability.'
40424051
FROM #plan_creation p ;

0 commit comments

Comments
 (0)