This commit is contained in:
2023-04-06 08:18:10 +02:00
parent 16640f9512
commit 7e98e5e95b

View File

@@ -1,57 +1,73 @@
USE master /*=============================================================================
Fetch index creation recommendation and match them with a query plan to
try to locate the query that generated the recommendation
Creation : 06.04.2023 / TSC
Modifications:
=============================================================================*/
USE master;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
GO GO
WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan') WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
, PlanMissingIndexes , PlanMissingIndexes
AS (SELECT query_plan, usecounts AS (SELECT [qp].[query_plan],
FROM sys.dm_exec_cached_plans cp [cp].[usecounts]
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp FROM sys.dm_exec_cached_plans cp
WHERE qp.query_plan.exist('//MissingIndexes') = 1) CROSS APPLY sys.dm_exec_query_plan([cp].[plan_handle]) qp
, MissingIndexes WHERE [qp].[query_plan].exist('//MissingIndexes') = 1),
AS (SELECT stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/MissingIndex/@Database)[1]', 'sysname') AS DatabaseName, MissingIndexes
stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/MissingIndex/@Schema)[1]', 'sysname') AS SchemaName, AS (SELECT stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/MissingIndex/@Database)[1]', 'sysname') AS DatabaseName,
stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/MissingIndex/@Table)[1]', 'sysname') AS TableName, stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/MissingIndex/@Schema)[1]', 'sysname') AS SchemaName,
stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/@Impact)[1]', 'float') AS Impact, stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/MissingIndex/@Table)[1]', 'sysname') AS TableName,
ISNULL(CAST(stmt_xml.value('(@StatementSubTreeCost)[1]', 'VARCHAR(128)') AS FLOAT), 0) AS Cost, stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/@Impact)[1]', 'float') AS Impact,
pmi.usecounts UseCounts, ISNULL(CAST(stmt_xml.value('(@StatementSubTreeCost)[1]', 'VARCHAR(128)') AS FLOAT), 0) AS Cost,
STUFF((SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname') [pmi].[usecounts] UseCounts,
FROM stmt_xml.nodes('//ColumnGroup') AS t(cg) STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname')
CROSS APPLY cg.nodes('Column') AS r(c) FROM stmt_xml.nodes('//ColumnGroup') AS t(cg)
WHERE cg.value('(@Usage)[1]', 'sysname') = 'EQUALITY' CROSS APPLY cg.nodes('Column') AS r(c)
FOR XML PATH('')),1,2,'' WHERE cg.value('(@Usage)[1]', 'sysname') = 'EQUALITY'
) AS equality_columns, FOR XML PATH('')),
STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname') 1,
FROM stmt_xml.nodes('//ColumnGroup') AS t(cg) 2,
CROSS APPLY cg.nodes('Column') AS r(c) '') AS equality_columns,
WHERE cg.value('(@Usage)[1]', 'sysname') = 'INEQUALITY' STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname')
FOR XML PATH('')),1,2,'' FROM stmt_xml.nodes('//ColumnGroup') AS t(cg)
) AS inequality_columns, CROSS APPLY cg.nodes('Column') AS r(c)
STUFF((SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname') WHERE cg.value('(@Usage)[1]', 'sysname') = 'INEQUALITY'
FROM stmt_xml.nodes('//ColumnGroup') AS t(cg) FOR XML PATH('')),
CROSS APPLY cg.nodes('Column') AS r(c) 1,
WHERE cg.value('(@Usage)[1]', 'sysname') = 'INCLUDE' 2,
FOR XML PATH('')),1,2,'' '') AS inequality_columns,
) AS include_columns, STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname')
query_plan, FROM stmt_xml.nodes('//ColumnGroup') AS t(cg)
stmt_xml.value('(@StatementText)[1]', 'varchar(4000)') AS sql_text CROSS APPLY cg.nodes('Column') AS r(c)
FROM PlanMissingIndexes pmi WHERE cg.value('(@Usage)[1]', 'sysname') = 'INCLUDE'
CROSS APPLY query_plan.nodes('//StmtSimple') AS stmt(stmt_xml) FOR XML PATH('')),
WHERE stmt_xml.exist('QueryPlan/MissingIndexes') = 1) 1,
2,
SELECT TOP 200 '') AS include_columns,
DatabaseName, [pmi].[query_plan],
SchemaName, stmt_xml.value('(@StatementText)[1]', 'varchar(max)') AS sql_text
TableName, FROM PlanMissingIndexes pmi
equality_columns, CROSS APPLY query_plan.nodes('//StmtSimple') AS stmt(stmt_xml)
inequality_columns, WHERE stmt_xml.exist('QueryPlan/MissingIndexes') = 1)
include_columns, SELECT TOP 200 [MissingIndexes].[DatabaseName],
UseCounts, [MissingIndexes].[SchemaName],
Cost, [MissingIndexes].[TableName],
Cost * UseCounts [AggregateCost], [MissingIndexes].[equality_columns],
Impact, [MissingIndexes].[inequality_columns],
query_plan [MissingIndexes].[include_columns],
FROM MissingIndexes [MissingIndexes].[UseCounts],
WHERE DatabaseName = '[arizona]' [MissingIndexes].[Cost],
AND TableName = '[PH_prescription_line]' [MissingIndexes].[Cost] * [MissingIndexes].[UseCounts] AS [AggregateCost],
ORDER BY Cost * UseCounts DESC; [MissingIndexes].[Impact],
[MissingIndexes].[query_plan],
[MissingIndexes].[sql_text]
FROM MissingIndexes
--WHERE [MissingIndexes].[DatabaseName] = '[arizona]'
--AND [MissingIndexes].[TableName] = '[PH_prescription_line]'
ORDER BY [AggregateCost] DESC;