@@ -133,7 +133,8 @@ DECLARE @StringToExecute NVARCHAR(MAX),
133133 @UnquotedOutputServerName NVARCHAR (256 ) = @OutputServerName ,
134134 @UnquotedOutputDatabaseName NVARCHAR (256 ) = @OutputDatabaseName ,
135135 @UnquotedOutputSchemaName NVARCHAR (256 ) = @OutputSchemaName ,
136- @LocalServerName NVARCHAR (128 ) = CAST (SERVERPROPERTY (' ServerName' ) AS NVARCHAR (128 ));
136+ @LocalServerName NVARCHAR (128 ) = CAST (SERVERPROPERTY (' ServerName' ) AS NVARCHAR (128 )),
137+ @dm_exec_query_statistics_xml BIT = 0 ;
137138
138139/* Sanitize our inputs */
139140SELECT
@@ -1023,6 +1024,35 @@ BEGIN
10231024
10241025 END
10251026
1027+ DECLARE @v DECIMAL (6 ,2 ),
1028+ @build INT ,
1029+ @memGrantSortSupported BIT = 1 ;
1030+
1031+ RAISERROR (N ' Determining SQL Server version.' ,0 ,1 ) WITH NOWAIT ;
1032+
1033+ INSERT INTO #checkversion (version )
1034+ SELECT CAST (SERVERPROPERTY (' ProductVersion' ) AS NVARCHAR (128 ))
1035+ OPTION (RECOMPILE );
1036+
1037+
1038+ SELECT @v = common_version ,
1039+ @build = build
1040+ FROM #checkversion
1041+ OPTION (RECOMPILE );
1042+
1043+ IF (@v < 11 )
1044+ OR (@v = 11 AND @build < 6020 )
1045+ OR (@v = 12 AND @build < 5000 )
1046+ OR (@v = 13 AND @build < 1601 )
1047+ SET @memGrantSortSupported = 0 ;
1048+
1049+ IF EXISTS (SELECT * FROM sys .all_objects WHERE name = ' dm_exec_query_statistics_xml' )
1050+ AND ((@v = 13 AND @build >= 5337 ) /* This DMF causes assertion errors: https://support.microsoft.com/en-us/help/4490136/fix-assertion-error-occurs-when-you-use-sys-dm-exec-query-statistics-x */
1051+ OR (@v = 14 AND @build >= 3162 )
1052+ OR (@v >= 15 )
1053+ OR (@v <= 12 )) /* Azure */
1054+ SET @dm_exec_query_statistics_xml = 1 ;
1055+
10261056
10271057 SET @StockWarningHeader = ' <?ClickToSeeCommmand -- ' + @LineFeed + @LineFeed
10281058 + ' WARNING: Running this command may result in data loss or an outage.' + @LineFeed
@@ -1795,6 +1825,7 @@ If one of them is a lead blocker, consider killing that query.'' AS HowToStopit,
17951825 ON r .session_id = s .session_id
17961826 WHERE s .host_name IS NOT NULL
17971827 AND r .total_elapsed_time > 5000 )
1828+ BEGIN
17981829
17991830 SET @StringToExecute = N'
18001831 DECLARE @bad_estimate TABLE
@@ -1818,6 +1849,7 @@ If one of them is a lead blocker, consider killing that query.'' AS HowToStopit,
18181849 ELSE 0
18191850 END AS estimate_inaccuracy
18201851 FROM sys.dm_exec_query_profiles AS deqp
1852+ WHERE deqp.session_id <> @@SPID
18211853 ) AS x
18221854 WHERE x.estimate_inaccuracy = 1
18231855 GROUP BY x.session_id,
@@ -1878,6 +1910,7 @@ If one of them is a lead blocker, consider killing that query.'' AS HowToStopit,
18781910 AS node_dop
18791911 FROM sys.dm_exec_query_profiles AS deqp
18801912 WHERE deqp.thread_id > 0
1913+ AND deqp.session_id <> @@SPID
18811914 AND EXISTS
18821915 (
18831916 SELECT 1/0
@@ -1899,7 +1932,7 @@ If one of them is a lead blocker, consider killing that query.'' AS HowToStopit,
18991932 CheckID 42: Queries in dm_exec_query_profiles showing signs of poor cardinality estimates
19001933 */
19011934 INSERT INTO #BlitzFirstResults
1902- (CheckID, Priority, FindingsGroup, Finding, URL, Details, HowToStopIt, StartTime, LoginName, NTUserName, ProgramName, HostName, DatabaseID, DatabaseName, QueryText, OpenTransactionCount, QueryHash)
1935+ (CheckID, Priority, FindingsGroup, Finding, URL, Details, HowToStopIt, StartTime, LoginName, NTUserName, ProgramName, HostName, DatabaseID, DatabaseName, QueryText, OpenTransactionCount, QueryHash, QueryPlan )
19031936 SELECT 42 AS CheckID,
19041937 100 AS Priority,
19051938 '' Query Performance'' AS FindingsGroup,
@@ -1920,21 +1953,34 @@ If one of them is a lead blocker, consider killing that query.'' AS HowToStopit,
19201953 DB_NAME(r.database_id),
19211954 dest.text,
19221955 s.open_transaction_count,
1923- r.query_hash
1956+ r.query_hash, ' ;
1957+
1958+ IF @dm_exec_query_statistics_xml = 1
1959+ SET @StringToExecute = @StringToExecute + N ' COALESCE(qs_live.query_plan, qp.query_plan) AS query_plan ' ;
1960+ ELSE
1961+ SET @StringToExecute = @StringToExecute + N ' qp.query_plan ' ;
1962+
1963+ SET @StringToExecute = @StringToExecute + N'
19241964 FROM @bad_estimate AS b
19251965 JOIN sys.dm_exec_requests AS r
19261966 ON r.session_id = b.session_id
19271967 AND r.request_id = b.request_id
19281968 JOIN sys.dm_exec_sessions AS s
19291969 ON s.session_id = b.session_id
1930- CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS dest;
1970+ CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS dest
1971+ CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) AS qp ' ;
19311972
1973+ IF EXISTS (SELECT * FROM sys .all_objects WHERE name = ' dm_exec_query_statistics_xml' )
1974+ SET @StringToExecute = @StringToExecute + N ' OUTER APPLY sys.dm_exec_query_statistics_xml(s.session_id) qs_live ' ;
1975+
1976+
1977+ SET @StringToExecute = @StringToExecute + N' ;
19321978
19331979 /*
19341980 CheckID 43: Queries in dm_exec_query_profiles showing signs of unbalanced parallelism
19351981 */
19361982 INSERT INTO #BlitzFirstResults
1937- (CheckID, Priority, FindingsGroup, Finding, URL, Details, HowToStopIt, StartTime, LoginName, NTUserName, ProgramName, HostName, DatabaseID, DatabaseName, QueryText, OpenTransactionCount, QueryHash)
1983+ (CheckID, Priority, FindingsGroup, Finding, URL, Details, HowToStopIt, StartTime, LoginName, NTUserName, ProgramName, HostName, DatabaseID, DatabaseName, QueryText, OpenTransactionCount, QueryHash, QueryPlan )
19381984 SELECT 43 AS CheckID,
19391985 100 AS Priority,
19401986 '' Query Performance'' AS FindingsGroup,
@@ -1955,17 +2001,31 @@ If one of them is a lead blocker, consider killing that query.'' AS HowToStopit,
19552001 DB_NAME(r.database_id),
19562002 dest.text,
19572003 s.open_transaction_count,
1958- r.query_hash
2004+ r.query_hash, ' ;
2005+
2006+ IF @dm_exec_query_statistics_xml = 1
2007+ SET @StringToExecute = @StringToExecute + N ' COALESCE(qs_live.query_plan, qp.query_plan) AS query_plan ' ;
2008+ ELSE
2009+ SET @StringToExecute = @StringToExecute + N ' qp.query_plan ' ;
2010+
2011+ SET @StringToExecute = @StringToExecute + N'
19592012 FROM @parallelism_skew AS p
19602013 JOIN sys.dm_exec_requests AS r
19612014 ON r.session_id = p.session_id
19622015 AND r.request_id = p.request_id
19632016 JOIN sys.dm_exec_sessions AS s
19642017 ON s.session_id = p.session_id
1965- CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS dest;
1966- ' ;
1967-
1968- EXECUTE sp_executesql @StringToExecute;
2018+ CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS dest
2019+ CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) AS qp ' ;
2020+
2021+ IF EXISTS (SELECT * FROM sys .all_objects WHERE name = ' dm_exec_query_statistics_xml' )
2022+ SET @StringToExecute = @StringToExecute + N ' OUTER APPLY sys.dm_exec_query_statistics_xml(s.session_id) qs_live ' ;
2023+
2024+
2025+ SET @StringToExecute = @StringToExecute + N ' ;' ;
2026+
2027+ EXECUTE sp_executesql @StringToExecute;
2028+ END
19692029
19702030 END
19712031 END
@@ -2854,27 +2914,7 @@ If one of them is a lead blocker, consider killing that query.'' AS HowToStopit,
28542914 FROM sys .databases
28552915 WHERE QUOTENAME ([name]) = @OutputDatabaseName)
28562916 BEGIN
2857- DECLARE @v DECIMAL (6 ,2 ),
2858- @build INT ,
2859- @memGrantSortSupported BIT = 1 ;
2860-
2861- RAISERROR (N ' Determining SQL Server version.' ,0 ,1 ) WITH NOWAIT ;
2862-
2863- INSERT INTO #checkversion (version )
2864- SELECT CAST (SERVERPROPERTY (' ProductVersion' ) AS NVARCHAR (128 ))
2865- OPTION (RECOMPILE );
2866-
2867-
2868- SELECT @v = common_version ,
2869- @build = build
2870- FROM #checkversion
2871- OPTION (RECOMPILE );
28722917
2873- IF (@v < 11 )
2874- OR (@v = 11 AND @build < 6020 )
2875- OR (@v = 12 AND @build < 5000 )
2876- OR (@v = 13 AND @build < 1601 )
2877- SET @memGrantSortSupported = 0 ;
28782918
28792919 RAISERROR (' Calling sp_BlitzCache' ,10 ,1 ) WITH NOWAIT ;
28802920
0 commit comments