Skip to content

Commit 7fcd811

Browse files
authored
Merge pull request BrentOzarULTD#336 from BrentOzarULTD/BlitzCache_Erik_Issue334
You are a god amongst men. And kids. Mostly kids.
2 parents 005118b + 81d0105 commit 7fcd811

File tree

1 file changed

+50
-26
lines changed

1 file changed

+50
-26
lines changed

sp_BlitzCache.sql

+50-26
Original file line numberDiff line numberDiff line change
@@ -1559,24 +1559,50 @@ WHERE ##bou_BlitzCacheProcs.QueryHash = x.QueryHash
15591559
OPTION (RECOMPILE) ;
15601560

15611561
-- statement level checks
1562-
WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
1563-
UPDATE ##bou_BlitzCacheProcs
1564-
SET QueryPlanCost = CASE WHEN QueryType LIKE '%Stored Procedure%' THEN
1565-
statement.value('sum(/p:StmtSimple/@StatementSubTreeCost)', 'float')
1566-
ELSE
1567-
statement.value('sum(/p:StmtSimple[xs:hexBinary(substring(@QueryPlanHash, 3)) = xs:hexBinary(sql:column("QueryPlanHash"))]/@StatementSubTreeCost)', 'float')
1568-
END ,
1569-
compile_timeout = CASE WHEN statement.exist('/p:StmtSimple/@StatementOptmEarlyAbortReason[.="TimeOut"]') = 1 THEN 1 END ,
1570-
compile_memory_limit_exceeded = CASE WHEN statement.exist('/p:StmtSimple/@StatementOptmEarlyAbortReason[.="MemoryLimitExceeded"]') = 1 THEN 1 END ,
1571-
unmatched_index_count = statement.value('count(//p:UnmatchedIndexes/Parameterization/Object)', 'int') ,
1572-
is_trivial = CASE WHEN statement.exist('/p:StmtSimple[@StatementOptmLevel[.="TRIVIAL"]]/p:QueryPlan/p:ParameterList') = 1 THEN 1 END ,
1573-
unparameterized_query = CASE WHEN statement.exist('//p:StmtSimple[@StatementOptmLevel[.="FULL"]]/p:QueryPlan/p:ParameterList') = 1 AND
1574-
statement.exist('//p:StmtSimple[@StatementOptmLevel[.="FULL"]]/p:QueryPlan/p:ParameterList/p:ColumnReference') = 0 THEN 1
1575-
WHEN statement.exist('//p:StmtSimple[@StatementOptmLevel[.="FULL"]]/p:QueryPlan/p:ParameterList') = 0 AND
1576-
statement.exist('//p:StmtSimple[@StatementOptmLevel[.="FULL"]]/*/p:RelOp/descendant::p:ScalarOperator/p:Identifier/p:ColumnReference[contains(@Column, "@")]') = 1 THEN 1
1577-
END
1578-
FROM #statements s
1579-
WHERE s.QueryHash = ##bou_BlitzCacheProcs.QueryHash
1562+
;WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
1563+
, c1 AS (
1564+
SELECT
1565+
QueryPlanCost_check = CASE WHEN QueryType LIKE '%Stored Procedure%' THEN
1566+
statement.value('sum(/p:StmtSimple/@StatementSubTreeCost)', 'float')
1567+
ELSE
1568+
statement.value('sum(/p:StmtSimple[xs:hexBinary(substring(@QueryPlanHash, 3)) = xs:hexBinary(sql:column("QueryPlanHash"))]/@StatementSubTreeCost)', 'float')
1569+
END ,
1570+
compile_timeout_check = CASE WHEN statement.exist('/p:StmtSimple/@StatementOptmEarlyAbortReason[.="TimeOut"]') = 1 THEN 1 END ,
1571+
compile_memory_limit_exceeded_check = CASE WHEN statement.exist('/p:StmtSimple/@StatementOptmEarlyAbortReason[.="MemoryLimitExceeded"]') = 1 THEN 1 END ,
1572+
unmatched_index_count_check = statement.value('count(//p:UnmatchedIndexes/Parameterization/Object)', 'int') ,
1573+
is_trivial_check = CASE WHEN statement.exist('/p:StmtSimple[@StatementOptmLevel[.="TRIVIAL"]]/p:QueryPlan/p:ParameterList') = 1 THEN 1 END ,
1574+
unparameterized_query_check = CASE WHEN statement.exist('//p:StmtSimple[@StatementOptmLevel[.="FULL"]]/p:QueryPlan/p:ParameterList') = 1 AND
1575+
statement.exist('//p:StmtSimple[@StatementOptmLevel[.="FULL"]]/p:QueryPlan/p:ParameterList/p:ColumnReference') = 0 THEN 1
1576+
WHEN statement.exist('//p:StmtSimple[@StatementOptmLevel[.="FULL"]]/p:QueryPlan/p:ParameterList') = 0 AND
1577+
statement.exist('//p:StmtSimple[@StatementOptmLevel[.="FULL"]]/*/p:RelOp/descendant::p:ScalarOperator/p:Identifier/p:ColumnReference[contains(@Column, "@")]') = 1 THEN 1
1578+
END,
1579+
s.QueryHash
1580+
FROM #statements s
1581+
JOIN ##bou_BlitzCacheProcs b
1582+
ON b.QueryHash = s.QueryHash
1583+
), c2 AS (
1584+
SELECT
1585+
QueryHash,
1586+
QueryPlanCost = MAX([c1].[QueryPlanCost_check]) ,
1587+
compile_timeout = MAX([c1].[compile_timeout_check]) ,
1588+
compile_memory_limit_exceeded = MAX([c1].[compile_memory_limit_exceeded_check]) ,
1589+
unmatched_index_count = MAX([c1].[unmatched_index_count_check]) ,
1590+
is_trivial = MAX([c1].[is_trivial_check]) ,
1591+
unparameterized_query = MAX([c1].[unparameterized_query_check])
1592+
FROM c1
1593+
GROUP BY QueryHash
1594+
)
1595+
UPDATE b
1596+
SET
1597+
b.QueryPlanCost = c2.QueryPlanCost,
1598+
b.compile_timeout = c2.compile_timeout,
1599+
b.compile_memory_limit_exceeded = c2.compile_memory_limit_exceeded,
1600+
b.unmatched_index_count = c2.unmatched_index_count,
1601+
b.is_trivial = c2.is_trivial,
1602+
b.unparameterized_query = c2.unparameterized_query
1603+
FROM [c2] AS c2
1604+
JOIN ##bou_BlitzCacheProcs AS b
1605+
ON c2.QueryHash = b.QueryHash
15801606
OPTION (RECOMPILE);
15811607

15821608
-- query level checks
@@ -1589,9 +1615,9 @@ SET missing_index_count = query_plan.value('count(/p:QueryPlan/p:MissingInde
15891615
CompileTime = query_plan.value('sum(/p:QueryPlan/@CompileTime)', 'float') ,
15901616
CompileCPU = query_plan.value('sum(/p:QueryPlan/@CompileCPU)', 'float') ,
15911617
CompileMemory = query_plan.value('sum(/p:QueryPlan/@CompileMemory)', 'float') ,
1592-
implicit_conversions = CASE WHEN QueryPlan.exist('/p:QueryPlan/p:Warnings/p:PlanAffectingConvert/@Expression[contains(., "CONVERT_IMPLICIT")]') = 1 THEN 1 END ,
1593-
plan_warnings = CASE WHEN QueryPlan.value('count(/p:QueryPlan/p:Warnings)', 'int') > 0 THEN 1 END,
1594-
is_forced_serial = CASE WHEN QueryPlan.value('count(/p:QueryPlan/@NonParallelPlanReason)', 'int') > 0 THEN 1 END
1618+
implicit_conversions = CASE WHEN query_plan.exist('/p:QueryPlan/p:Warnings/p:PlanAffectingConvert/@Expression[contains(., "CONVERT_IMPLICIT")]') = 1 THEN 1 END ,
1619+
plan_warnings = CASE WHEN query_plan.value('count(/p:QueryPlan/p:Warnings)', 'int') > 0 THEN 1 END,
1620+
is_forced_serial = CASE WHEN query_plan.value('count(/p:QueryPlan/@NonParallelPlanReason)', 'int') > 0 THEN 1 END
15951621
FROM #query_plan qp
15961622
WHERE qp.QueryHash = ##bou_BlitzCacheProcs.QueryHash
15971623
OPTION (RECOMPILE);
@@ -1667,7 +1693,6 @@ SET NumberOfDistinctPlans = distinct_plan_count,
16671693
unmatched_index_count = QueryPlan.value('count(//p:UnmatchedIndexes/p:Parameterization/p:Object)', 'int') ,
16681694
plan_multiple_plans = CASE WHEN distinct_plan_count < number_of_plans THEN 1 END ,
16691695
is_trivial = CASE WHEN QueryPlan.exist('//p:StmtSimple[@StatementOptmLevel[.="TRIVIAL"]]/p:QueryPlan/p:ParameterList') = 1 THEN 1 END ,
1670-
is_forced_serial = CASE WHEN QueryPlan.value('count(//p:QueryPlan/@NonParallelPlanReason)', 'int') > 0 THEN 1 END,
16711696
SerialDesiredMemory = QueryPlan.value('sum(//p:MemoryGrantInfo/@SerialDesiredMemory)', 'float') ,
16721697
SerialRequiredMemory = QueryPlan.value('sum(//p:MemoryGrantInfo/@SerialRequiredMemory)', 'float'),
16731698
CachedPlanSize = QueryPlan.value('sum(//p:QueryPlan/@CachedPlanSize)', 'float') ,
@@ -2127,7 +2152,7 @@ BEGIN
21272152
CASE WHEN compile_memory_limit_exceeded = 1 THEN '', 19'' ELSE '''' END +
21282153
CASE WHEN busy_loops = 1 THEN '', 16'' ELSE '''' END +
21292154
CASE WHEN is_forced_plan = 1 THEN '', 3'' ELSE '''' END +
2130-
CASE WHEN is_forced_parameterized = 1 THEN '', 5'' ELSE '''' END +
2155+
CASE WHEN is_forced_parameterized > 0 THEN '', 5'' ELSE '''' END +
21312156
CASE WHEN unparameterized_query = 1 THEN '', 23'' ELSE '''' END +
21322157
CASE WHEN missing_index_count > 0 THEN '', 10'' ELSE '''' END +
21332158
CASE WHEN unmatched_index_count > 0 THEN '', 22'' ELSE '''' END +
@@ -2142,9 +2167,8 @@ BEGIN
21422167
CASE WHEN implicit_conversions = 1 THEN '', 14'' ELSE '''' END +
21432168
CASE WHEN tvf_join = 1 THEN '', 17'' ELSE '''' END +
21442169
CASE WHEN plan_multiple_plans = 1 THEN '', 21'' ELSE '''' END +
2145-
CASE WHEN unmatched_index_count > 0 THEN '', 22'', ELSE '''' END +
2146-
CASE WHEN unparameterized_query > 0 THEN '', 23'', ELSE '''' END +
2147-
CASE WHEN is_trivial = 1 THEN '', 24'', ELSE '''' END +
2170+
CASE WHEN unmatched_index_count > 0 THEN '', 22'' ELSE '''' END +
2171+
CASE WHEN is_trivial = 1 THEN '', 24'' ELSE '''' END +
21482172
CASE WHEN is_forced_serial = 1 THEN '', 25'' ELSE '''' END +
21492173
CASE WHEN is_key_lookup_expensive = 1 THEN '', 26'' ELSE '''' END +
21502174
CASE WHEN is_remote_query_expensive = 1 THEN '', 28'' ELSE '''' END

0 commit comments

Comments
 (0)