@@ -1559,24 +1559,50 @@ WHERE ##bou_BlitzCacheProcs.QueryHash = x.QueryHash
1559
1559
OPTION (RECOMPILE ) ;
1560
1560
1561
1561
-- 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
1580
1606
OPTION (RECOMPILE );
1581
1607
1582
1608
-- query level checks
@@ -1589,9 +1615,9 @@ SET missing_index_count = query_plan.value('count(/p:QueryPlan/p:MissingInde
1589
1615
CompileTime = query_plan .value (' sum(/p:QueryPlan/@CompileTime)' , ' float' ) ,
1590
1616
CompileCPU = query_plan .value (' sum(/p:QueryPlan/@CompileCPU)' , ' float' ) ,
1591
1617
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
1595
1621
FROM #query_plan qp
1596
1622
WHERE qp .QueryHash = ##bou_BlitzCacheProcs .QueryHash
1597
1623
OPTION (RECOMPILE );
@@ -1667,7 +1693,6 @@ SET NumberOfDistinctPlans = distinct_plan_count,
1667
1693
unmatched_index_count = QueryPlan .value (' count(//p:UnmatchedIndexes/p:Parameterization/p:Object)' , ' int' ) ,
1668
1694
plan_multiple_plans = CASE WHEN distinct_plan_count < number_of_plans THEN 1 END ,
1669
1695
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 ,
1671
1696
SerialDesiredMemory = QueryPlan .value (' sum(//p:MemoryGrantInfo/@SerialDesiredMemory)' , ' float' ) ,
1672
1697
SerialRequiredMemory = QueryPlan .value (' sum(//p:MemoryGrantInfo/@SerialRequiredMemory)' , ' float' ),
1673
1698
CachedPlanSize = QueryPlan .value (' sum(//p:QueryPlan/@CachedPlanSize)' , ' float' ) ,
@@ -2127,7 +2152,7 @@ BEGIN
2127
2152
CASE WHEN compile_memory_limit_exceeded = 1 THEN '' , 19'' ELSE '' '' END +
2128
2153
CASE WHEN busy_loops = 1 THEN '' , 16'' ELSE '' '' END +
2129
2154
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 +
2131
2156
CASE WHEN unparameterized_query = 1 THEN '' , 23'' ELSE '' '' END +
2132
2157
CASE WHEN missing_index_count > 0 THEN '' , 10'' ELSE '' '' END +
2133
2158
CASE WHEN unmatched_index_count > 0 THEN '' , 22'' ELSE '' '' END +
@@ -2142,9 +2167,8 @@ BEGIN
2142
2167
CASE WHEN implicit_conversions = 1 THEN '' , 14'' ELSE '' '' END +
2143
2168
CASE WHEN tvf_join = 1 THEN '' , 17'' ELSE '' '' END +
2144
2169
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 +
2148
2172
CASE WHEN is_forced_serial = 1 THEN '' , 25'' ELSE '' '' END +
2149
2173
CASE WHEN is_key_lookup_expensive = 1 THEN '' , 26'' ELSE '' '' END +
2150
2174
CASE WHEN is_remote_query_expensive = 1 THEN '' , 28'' ELSE '' '' END
0 commit comments