73 lines
4.0 KiB
Transact-SQL
73 lines
4.0 KiB
Transact-SQL
/*=============================================================================
|
|
|
|
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;
|
|
GO
|
|
|
|
WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
|
|
, PlanMissingIndexes
|
|
AS (SELECT [qp].[query_plan],
|
|
[cp].[usecounts]
|
|
FROM sys.dm_exec_cached_plans cp
|
|
CROSS APPLY sys.dm_exec_query_plan([cp].[plan_handle]) qp
|
|
WHERE [qp].[query_plan].exist('//MissingIndexes') = 1),
|
|
MissingIndexes
|
|
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/@Table)[1]', 'sysname') AS TableName,
|
|
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,
|
|
[pmi].[usecounts] UseCounts,
|
|
STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname')
|
|
FROM stmt_xml.nodes('//ColumnGroup') AS t(cg)
|
|
CROSS APPLY cg.nodes('Column') AS r(c)
|
|
WHERE cg.value('(@Usage)[1]', 'sysname') = 'EQUALITY'
|
|
FOR XML PATH('')),
|
|
1,
|
|
2,
|
|
'') AS equality_columns,
|
|
STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname')
|
|
FROM stmt_xml.nodes('//ColumnGroup') AS t(cg)
|
|
CROSS APPLY cg.nodes('Column') AS r(c)
|
|
WHERE cg.value('(@Usage)[1]', 'sysname') = 'INEQUALITY'
|
|
FOR XML PATH('')),
|
|
1,
|
|
2,
|
|
'') AS inequality_columns,
|
|
STUFF(( SELECT DISTINCT ', ' + c.value('(@Name)[1]', 'sysname')
|
|
FROM stmt_xml.nodes('//ColumnGroup') AS t(cg)
|
|
CROSS APPLY cg.nodes('Column') AS r(c)
|
|
WHERE cg.value('(@Usage)[1]', 'sysname') = 'INCLUDE'
|
|
FOR XML PATH('')),
|
|
1,
|
|
2,
|
|
'') AS include_columns,
|
|
[pmi].[query_plan],
|
|
stmt_xml.value('(@StatementText)[1]', 'varchar(max)') AS sql_text
|
|
FROM PlanMissingIndexes pmi
|
|
CROSS APPLY query_plan.nodes('//StmtSimple') AS stmt(stmt_xml)
|
|
WHERE stmt_xml.exist('QueryPlan/MissingIndexes') = 1)
|
|
SELECT TOP 200 [MissingIndexes].[DatabaseName],
|
|
[MissingIndexes].[SchemaName],
|
|
[MissingIndexes].[TableName],
|
|
[MissingIndexes].[equality_columns],
|
|
[MissingIndexes].[inequality_columns],
|
|
[MissingIndexes].[include_columns],
|
|
[MissingIndexes].[UseCounts],
|
|
[MissingIndexes].[Cost],
|
|
[MissingIndexes].[Cost] * [MissingIndexes].[UseCounts] AS [AggregateCost],
|
|
[MissingIndexes].[Impact],
|
|
[MissingIndexes].[query_plan],
|
|
[MissingIndexes].[sql_text]
|
|
FROM MissingIndexes
|
|
WHERE [MissingIndexes].[DatabaseName] IN('[arizona]', '[arizonaCust]', '[arizonaRep]','[hcitools]')
|
|
--AND [MissingIndexes].[TableName] = '[PH_prescription_line]'
|
|
ORDER BY [AggregateCost] DESC; |