sync
This commit is contained in:
@@ -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;
|
||||||
Reference in New Issue
Block a user