Skip to content

Commit 1e6bee2

Browse files
authored
#2019 sp_BlitzCache air_quote_actual plans (#2034)
Closes #2019.
1 parent 7433274 commit 1e6bee2

File tree

1 file changed

+71
-53
lines changed

1 file changed

+71
-53
lines changed

sp_BlitzCache.sql

Lines changed: 71 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,6 +1076,25 @@ IF @SkipAnalysis = 1
10761076
SET @HideSummary = 1;
10771077
END;
10781078

1079+
DECLARE @AllSortSql NVARCHAR(MAX) = N'';
1080+
DECLARE @VersionShowsMemoryGrants BIT;
1081+
IF EXISTS(SELECT * FROM sys.all_columns WHERE OBJECT_ID = OBJECT_ID('sys.dm_exec_query_stats') AND name = 'max_grant_kb')
1082+
SET @VersionShowsMemoryGrants = 1;
1083+
ELSE
1084+
SET @VersionShowsMemoryGrants = 0;
1085+
1086+
DECLARE @VersionShowsSpills BIT;
1087+
IF EXISTS(SELECT * FROM sys.all_columns WHERE OBJECT_ID = OBJECT_ID('sys.dm_exec_query_stats') AND name = 'max_spills')
1088+
SET @VersionShowsSpills = 1;
1089+
ELSE
1090+
SET @VersionShowsSpills = 0;
1091+
1092+
DECLARE @VersionShowsAirQuoteActualPlans BIT;
1093+
IF EXISTS(SELECT * FROM sys.all_columns WHERE OBJECT_ID = OBJECT_ID('sys.dm_exec_query_plan_stats') AND name = 'query_plan')
1094+
SET @VersionShowsAirQuoteActualPlans = 1;
1095+
ELSE
1096+
SET @VersionShowsAirQuoteActualPlans = 0;
1097+
10791098
IF @Reanalyze = 1 AND OBJECT_ID('tempdb..##BlitzCacheResults') IS NULL
10801099
BEGIN
10811100
RAISERROR(N'##BlitzCacheResults does not exist, can''t reanalyze', 0, 1) WITH NOWAIT;
@@ -1732,24 +1751,15 @@ SELECT @v = common_version ,
17321751
FROM #checkversion
17331752
OPTION (RECOMPILE);
17341753

1735-
IF (@SortOrder IN ('memory grant', 'avg memory grant'))
1736-
AND NOT EXISTS(SELECT * FROM sys.all_columns WHERE OBJECT_ID = OBJECT_ID('sys.dm_exec_query_stats') AND name = 'max_grant_kb')
1754+
IF (@SortOrder IN ('memory grant', 'avg memory grant')) AND @VersionShowsMemoryGrants = 0
17371755
BEGIN
17381756
RAISERROR('Your version of SQL does not support sorting by memory grant or average memory grant. Please use another sort order.', 16, 1);
17391757
RETURN;
17401758
END;
17411759

1742-
IF (@SortOrder IN ('spills')
1743-
AND NOT EXISTS(SELECT * FROM sys.all_columns WHERE OBJECT_ID = OBJECT_ID('sys.dm_exec_query_stats') AND name = 'max_spills'))
1760+
IF (@SortOrder IN ('spills', 'avg spills') AND @VersionShowsSpills = 0)
17441761
BEGIN
1745-
RAISERROR('Your version of SQL does not support sorting by total spills. Please use another sort order.', 16, 1);
1746-
RETURN;
1747-
END;
1748-
1749-
IF (@SortOrder IN ('avg spills')
1750-
AND NOT EXISTS(SELECT * FROM sys.all_columns WHERE OBJECT_ID = OBJECT_ID('sys.dm_exec_query_stats') AND name = 'total_spills'))
1751-
BEGIN
1752-
RAISERROR('Your version of SQL does not support sorting by average spills. Please use another sort order.', 16, 1);
1762+
RAISERROR('Your version of SQL does not support sorting by spills. Please use another sort order.', 16, 1);
17531763
RETURN;
17541764
END;
17551765

@@ -1784,6 +1794,12 @@ FROM (SELECT TOP (@Top) x.*, xpa.*,
17841794
CROSS APPLY (SELECT * FROM sys.dm_exec_plan_attributes(x.plan_handle) AS ixpa
17851795
WHERE ixpa.attribute = ''dbid'') AS xpa ' + @nl ;
17861796

1797+
1798+
IF @VersionShowsAirQuoteActualPlans = 1
1799+
BEGIN
1800+
SET @body += N' CROSS APPLY sys.dm_exec_query_plan_stats(x.plan_handle) AS deqps ' + @nl ;
1801+
END
1802+
17871803
SET @body += N' WHERE 1 = 1 ' + @nl ;
17881804

17891805

@@ -1900,6 +1916,11 @@ SET @body += N') AS qs
19001916
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
19011917
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp ' + @nl ;
19021918

1919+
IF @VersionShowsAirQuoteActualPlans = 1
1920+
BEGIN
1921+
SET @body += N' CROSS APPLY sys.dm_exec_query_plan_stats(qs.plan_handle) AS deqps ' + @nl ;
1922+
END
1923+
19031924
SET @body_where += N' AND pa.attribute = ' + QUOTENAME('dbid', @q ) + @nl ;
19041925

19051926

@@ -1968,7 +1989,7 @@ SELECT TOP (@Top)
19681989
NULL AS PercentMemoryGrantUsed,
19691990
NULL AS AvgMaxMemoryGrant,';
19701991

1971-
IF @v >=15 OR (@v = 14 AND @build >= 3015) OR (@v = 13 AND @build >= 5026)
1992+
IF @VersionShowsSpills = 1
19721993
BEGIN
19731994
RAISERROR(N'Getting spill information for newer versions of SQL', 0, 1) WITH NOWAIT;
19741995
SET @plans_triggers_select_list += N'
@@ -1987,10 +2008,20 @@ SELECT TOP (@Top)
19872008
NULL AS AvgSpills, ' ;
19882009
END;
19892010

1990-
SET @plans_triggers_select_list +=
1991-
N'st.text AS QueryText ,
1992-
query_plan AS QueryPlan,
1993-
t.t_TotalWorker,
2011+
SET @plans_triggers_select_list +=
2012+
N'st.text AS QueryText ,';
2013+
2014+
IF @VersionShowsAirQuoteActualPlans = 1
2015+
BEGIN
2016+
SET @plans_triggers_select_list += N' COALESCE(deqps.query_plan, qp.query_plan) AS QueryPlan, ' + @nl ;
2017+
END;
2018+
ELSE
2019+
BEGIN
2020+
SET @plans_triggers_select_list += N' qp.query_plan AS QueryPlan, ' + @nl ;
2021+
END;
2022+
2023+
SET @plans_triggers_select_list +=
2024+
N't.t_TotalWorker,
19942025
t.t_TotalElapsed,
19952026
t.t_TotalReads,
19962027
t.t_TotalExecs,
@@ -2077,8 +2108,7 @@ BEGIN
20772108
NULL AS LastReturnedRows, ' ;
20782109
END;
20792110

2080-
IF (@v = 11 AND @build >= 6020) OR (@v = 12 AND @build >= 5000) OR (@v = 13 AND @build >= 1601) OR (@v >= 14)
2081-
2111+
IF @VersionShowsMemoryGrants = 1
20822112
BEGIN
20832113
RAISERROR(N'Getting memory grant information for newer versions of SQL', 0, 1) WITH NOWAIT;
20842114
SET @sql += N'
@@ -2101,7 +2131,7 @@ BEGIN
21012131
NULL AS AvgMaxMemoryGrant, ' ;
21022132
END;
21032133

2104-
IF @v >=15 OR (@v = 14 AND @build >= 3015) OR (@v = 13 AND @build >= 5026)
2134+
IF @VersionShowsSpills = 1
21052135
BEGIN
21062136
RAISERROR(N'Getting spill information for newer versions of SQL', 0, 1) WITH NOWAIT;
21072137
SET @sql += N'
@@ -2124,8 +2154,19 @@ BEGIN
21242154
SUBSTRING(st.text, ( qs.statement_start_offset / 2 ) + 1, ( ( CASE qs.statement_end_offset
21252155
WHEN -1 THEN DATALENGTH(st.text)
21262156
ELSE qs.statement_end_offset
2127-
END - qs.statement_start_offset ) / 2 ) + 1) AS QueryText ,
2128-
query_plan AS QueryPlan,
2157+
END - qs.statement_start_offset ) / 2 ) + 1) AS QueryText , ' + @nl ;
2158+
2159+
2160+
IF @VersionShowsAirQuoteActualPlans = 1
2161+
BEGIN
2162+
SET @sql += N' COALESCE(deqps.query_plan, qp.query_plan) AS QueryPlan, ' + @nl ;
2163+
END
2164+
ELSE
2165+
BEGIN
2166+
SET @sql += N' query_plan AS QueryPlan, ' + @nl ;
2167+
END
2168+
2169+
SET @sql += N'
21292170
t.t_TotalWorker,
21302171
t.t_TotalElapsed,
21312172
t.t_TotalReads,
@@ -6013,29 +6054,6 @@ IF OBJECT_ID('tempdb.. #bou_allsort') IS NULL
60136054
);
60146055
END;
60156056

6016-
DECLARE @AllSortSql NVARCHAR(MAX) = N'';
6017-
DECLARE @MemGrant BIT;
6018-
SELECT @MemGrant = CASE WHEN (
6019-
( @v < 11 )
6020-
OR (
6021-
@v = 11
6022-
AND @build < 6020
6023-
)
6024-
OR (
6025-
@v = 12
6026-
AND @build < 5000
6027-
)
6028-
OR (
6029-
@v = 13
6030-
AND @build < 1601
6031-
)
6032-
) THEN 0
6033-
ELSE 1
6034-
END;
6035-
6036-
DECLARE @Spills BIT;
6037-
SELECT @Spills = CASE WHEN (@v >= 15 OR (@v = 14 AND @build >= 3015) OR (@v = 13 AND @build >= 5026)) THEN 1 ELSE 0 END;
6038-
60396057

60406058
IF LOWER(@SortOrder) = 'all'
60416059
BEGIN
@@ -6098,7 +6116,7 @@ SET @AllSortSql += N'
60986116
60996117
';
61006118

6101-
IF @MemGrant = 0
6119+
IF @VersionShowsMemoryGrants = 0
61026120
BEGIN
61036121
IF @ExportToExcel = 1
61046122
BEGIN
@@ -6117,7 +6135,7 @@ SET @AllSortSql += N'
61176135

61186136
END;
61196137

6120-
IF @MemGrant = 1
6138+
IF @VersionShowsMemoryGrants = 1
61216139
BEGIN
61226140
SET @AllSortSql += N' SELECT TOP 1 @ISH = STUFF((SELECT DISTINCT N'','' + CONVERT(NVARCHAR(MAX),b2.SqlHandle, 1) FROM #bou_allsort AS b2 FOR XML PATH(N''''), TYPE).value(N''.[1]'', N''NVARCHAR(MAX)''), 1, 1, N'''') OPTION(RECOMPILE);
61236141
@@ -6146,7 +6164,7 @@ SET @AllSortSql += N'
61466164

61476165
END;
61486166

6149-
IF @Spills = 0
6167+
IF @VersionShowsSpills = 0
61506168
BEGIN
61516169
IF @ExportToExcel = 1
61526170
BEGIN
@@ -6165,7 +6183,7 @@ SET @AllSortSql += N'
61656183

61666184
END;
61676185

6168-
IF @Spills = 1
6186+
IF @VersionShowsSpills = 1
61696187
BEGIN
61706188
SET @AllSortSql += N' SELECT TOP 1 @ISH = STUFF((SELECT DISTINCT N'','' + CONVERT(NVARCHAR(MAX),b2.SqlHandle, 1) FROM #bou_allsort AS b2 FOR XML PATH(N''''), TYPE).value(N''.[1]'', N''NVARCHAR(MAX)''), 1, 1, N'''') OPTION(RECOMPILE);
61716189
@@ -6266,7 +6284,7 @@ SET @AllSortSql += N'
62666284
62676285
';
62686286

6269-
IF @MemGrant = 0
6287+
IF @VersionShowsMemoryGrants = 0
62706288
BEGIN
62716289
IF @ExportToExcel = 1
62726290
BEGIN
@@ -6285,7 +6303,7 @@ SET @AllSortSql += N'
62856303

62866304
END;
62876305

6288-
IF @MemGrant = 1
6306+
IF @VersionShowsMemoryGrants = 1
62896307
BEGIN
62906308
SET @AllSortSql += N' SELECT TOP 1 @ISH = STUFF((SELECT DISTINCT N'','' + CONVERT(NVARCHAR(MAX),b2.SqlHandle, 1) FROM #bou_allsort AS b2 FOR XML PATH(N''''), TYPE).value(N''.[1]'', N''NVARCHAR(MAX)''), 1, 1, N'''') OPTION(RECOMPILE);
62916309
@@ -6314,7 +6332,7 @@ SET @AllSortSql += N'
63146332

63156333
END;
63166334

6317-
IF @Spills = 0
6335+
IF @VersionShowsSpills = 0
63186336
BEGIN
63196337
IF @ExportToExcel = 1
63206338
BEGIN
@@ -6333,7 +6351,7 @@ SET @AllSortSql += N'
63336351

63346352
END;
63356353

6336-
IF @Spills = 1
6354+
IF @VersionShowsSpills = 1
63376355
BEGIN
63386356
SET @AllSortSql += N' SELECT TOP 1 @ISH = STUFF((SELECT DISTINCT N'','' + CONVERT(NVARCHAR(MAX),b2.SqlHandle, 1) FROM #bou_allsort AS b2 FOR XML PATH(N''''), TYPE).value(N''.[1]'', N''NVARCHAR(MAX)''), 1, 1, N'''') OPTION(RECOMPILE);
63396357

0 commit comments

Comments
 (0)