Skip to content

Commit a3a112f

Browse files
committed
Combined Issues 332 and 334
This addresses issue with broken @expertmode = 2 and with Statement level checks updating global table incorrectly.
1 parent 005118b commit a3a112f

File tree

1 file changed

+47
-22
lines changed

1 file changed

+47
-22
lines changed

sp_BlitzCache.sql

Lines changed: 47 additions & 22 deletions
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
@@ -2127,7 +2153,7 @@ BEGIN
21272153
CASE WHEN compile_memory_limit_exceeded = 1 THEN '', 19'' ELSE '''' END +
21282154
CASE WHEN busy_loops = 1 THEN '', 16'' ELSE '''' END +
21292155
CASE WHEN is_forced_plan = 1 THEN '', 3'' ELSE '''' END +
2130-
CASE WHEN is_forced_parameterized = 1 THEN '', 5'' ELSE '''' END +
2156+
CASE WHEN is_forced_parameterized > 0 THEN '', 5'' ELSE '''' END +
21312157
CASE WHEN unparameterized_query = 1 THEN '', 23'' ELSE '''' END +
21322158
CASE WHEN missing_index_count > 0 THEN '', 10'' ELSE '''' END +
21332159
CASE WHEN unmatched_index_count > 0 THEN '', 22'' ELSE '''' END +
@@ -2142,9 +2168,8 @@ BEGIN
21422168
CASE WHEN implicit_conversions = 1 THEN '', 14'' ELSE '''' END +
21432169
CASE WHEN tvf_join = 1 THEN '', 17'' ELSE '''' END +
21442170
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 +
2171+
CASE WHEN unmatched_index_count > 0 THEN '', 22'' ELSE '''' END +
2172+
CASE WHEN is_trivial = 1 THEN '', 24'' ELSE '''' END +
21482173
CASE WHEN is_forced_serial = 1 THEN '', 25'' ELSE '''' END +
21492174
CASE WHEN is_key_lookup_expensive = 1 THEN '', 26'' ELSE '''' END +
21502175
CASE WHEN is_remote_query_expensive = 1 THEN '', 28'' ELSE '''' END

0 commit comments

Comments
 (0)