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],
[cp].[usecounts]
FROM sys.dm_exec_cached_plans cp FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp CROSS APPLY sys.dm_exec_query_plan([cp].[plan_handle]) qp
WHERE qp.query_plan.exist('//MissingIndexes') = 1) WHERE [qp].[query_plan].exist('//MissingIndexes') = 1),
, MissingIndexes MissingIndexes
AS (SELECT stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/MissingIndex/@Database)[1]', 'sysname') AS DatabaseName, AS (SELECT stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/MissingIndex/@Database)[1]', 'sysname') AS DatabaseName,
stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/MissingIndex/@Schema)[1]', 'sysname') AS SchemaName, stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/MissingIndex/@Schema)[1]', 'sysname') AS SchemaName,
stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/MissingIndex/@Table)[1]', 'sysname') AS TableName, stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/MissingIndex/@Table)[1]', 'sysname') AS TableName,
stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/@Impact)[1]', 'float') AS Impact, stmt_xml.value('(QueryPlan/MissingIndexes/MissingIndexGroup/@Impact)[1]', 'float') AS Impact,
ISNULL(CAST(stmt_xml.value('(@StatementSubTreeCost)[1]', 'VARCHAR(128)') AS FLOAT), 0) AS Cost, ISNULL(CAST(stmt_xml.value('(@StatementSubTreeCost)[1]', 'VARCHAR(128)') AS FLOAT), 0) AS Cost,
pmi.usecounts UseCounts, [pmi].[usecounts] UseCounts,
STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname') STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname')
FROM stmt_xml.nodes('//ColumnGroup') AS t(cg) FROM stmt_xml.nodes('//ColumnGroup') AS t(cg)
CROSS APPLY cg.nodes('Column') AS r(c) CROSS APPLY cg.nodes('Column') AS r(c)
WHERE cg.value('(@Usage)[1]', 'sysname') = 'EQUALITY' WHERE cg.value('(@Usage)[1]', 'sysname') = 'EQUALITY'
FOR XML PATH('')),1,2,'' FOR XML PATH('')),
) AS equality_columns, 1,
2,
'') AS equality_columns,
STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname') STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname')
FROM stmt_xml.nodes('//ColumnGroup') AS t(cg) FROM stmt_xml.nodes('//ColumnGroup') AS t(cg)
CROSS APPLY cg.nodes('Column') AS r(c) CROSS APPLY cg.nodes('Column') AS r(c)
WHERE cg.value('(@Usage)[1]', 'sysname') = 'INEQUALITY' WHERE cg.value('(@Usage)[1]', 'sysname') = 'INEQUALITY'
FOR XML PATH('')),1,2,'' FOR XML PATH('')),
) AS inequality_columns, 1,
2,
'') AS inequality_columns,
STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname') STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname')
FROM stmt_xml.nodes('//ColumnGroup') AS t(cg) FROM stmt_xml.nodes('//ColumnGroup') AS t(cg)
CROSS APPLY cg.nodes('Column') AS r(c) CROSS APPLY cg.nodes('Column') AS r(c)
WHERE cg.value('(@Usage)[1]', 'sysname') = 'INCLUDE' WHERE cg.value('(@Usage)[1]', 'sysname') = 'INCLUDE'
FOR XML PATH('')),1,2,'' FOR XML PATH('')),
) AS include_columns, 1,
query_plan, 2,
stmt_xml.value('(@StatementText)[1]', 'varchar(4000)') AS sql_text '') AS include_columns,
[pmi].[query_plan],
stmt_xml.value('(@StatementText)[1]', 'varchar(max)') AS sql_text
FROM PlanMissingIndexes pmi FROM PlanMissingIndexes pmi
CROSS APPLY query_plan.nodes('//StmtSimple') AS stmt(stmt_xml) CROSS APPLY query_plan.nodes('//StmtSimple') AS stmt(stmt_xml)
WHERE stmt_xml.exist('QueryPlan/MissingIndexes') = 1) WHERE stmt_xml.exist('QueryPlan/MissingIndexes') = 1)
SELECT TOP 200 [MissingIndexes].[DatabaseName],
SELECT TOP 200 [MissingIndexes].[SchemaName],
DatabaseName, [MissingIndexes].[TableName],
SchemaName, [MissingIndexes].[equality_columns],
TableName, [MissingIndexes].[inequality_columns],
equality_columns, [MissingIndexes].[include_columns],
inequality_columns, [MissingIndexes].[UseCounts],
include_columns, [MissingIndexes].[Cost],
UseCounts, [MissingIndexes].[Cost] * [MissingIndexes].[UseCounts] AS [AggregateCost],
Cost, [MissingIndexes].[Impact],
Cost * UseCounts [AggregateCost], [MissingIndexes].[query_plan],
Impact, [MissingIndexes].[sql_text]
query_plan
FROM MissingIndexes FROM MissingIndexes
WHERE DatabaseName = '[arizona]' --WHERE [MissingIndexes].[DatabaseName] = '[arizona]'
AND TableName = '[PH_prescription_line]' --AND [MissingIndexes].[TableName] = '[PH_prescription_line]'
ORDER BY Cost * UseCounts DESC; ORDER BY [AggregateCost] DESC;