Skip to content

Commit 56b1cbc

Browse files
committed
#2401 sp_BlitzFirst get plans for cardinality misestimations
Closes #2401.
1 parent cb541e2 commit 56b1cbc

File tree

1 file changed

+70
-30
lines changed

1 file changed

+70
-30
lines changed

sp_BlitzFirst.sql

Lines changed: 70 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */
139140
SELECT
@@ -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

Comments
 (0)