diff --git a/DBG - get missing indexes with query plan.sql b/DBG - get missing indexes with query plan.sql index d5e1896..850ca2b 100644 --- a/DBG - get missing indexes with query plan.sql +++ b/DBG - get missing indexes with query plan.sql @@ -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; GO - + WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan') , PlanMissingIndexes -AS (SELECT query_plan, 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, - query_plan, - stmt_xml.value('(@StatementText)[1]', 'varchar(4000)') 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 - DatabaseName, - SchemaName, - TableName, - equality_columns, - inequality_columns, - include_columns, - UseCounts, - Cost, - Cost * UseCounts [AggregateCost], - Impact, - query_plan -FROM MissingIndexes -WHERE DatabaseName = '[arizona]' -AND TableName = '[PH_prescription_line]' -ORDER BY Cost * UseCounts DESC; \ No newline at end of file + 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] = '[arizona]' + --AND [MissingIndexes].[TableName] = '[PH_prescription_line]' + ORDER BY [AggregateCost] DESC; \ No newline at end of file