SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
DECLARE @IndexName AS NVARCHAR(128) = N'[YourIndexName]';
;WITH XMLNAMESPACES
(DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT
DB_NAME(x.dbid),
x.ObjectName,
stmt.value('(@StatementText)[1]', 'varchar(max)') AS SQL_Text,
obj.value('(@Database)[1]', 'varchar(128)') AS DatabaseName,
obj.value('(@Schema)[1]', 'varchar(128)') AS SchemaName,
obj.value('(@Table)[1]', 'varchar(128)') AS TableName,
obj.value('(@Index)[1]', 'varchar(128)') AS IndexName,
obj.value('(@IndexKind)[1]', 'varchar(128)') AS IndexKind,
x.plan_handle,
x.query_plan
FROM (
SELECT try_CONVERT(XML, qp.query_plan) AS query_plan, cp.plan_handle, OBJECT_NAME(qp.objectid, qp.dbid) AS ObjectName, qp.objectid, qp.dbid
FROM sys.dm_exec_cached_plans AS cp
JOIN sys.dm_exec_query_stats s ON s.plan_handle = cp.plan_handle
cross apply sys.dm_exec_text_query_plan (s.plan_handle, s.statement_start_offset, s.statement_end_offset) AS qp
) x
CROSS APPLY query_plan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple') AS batch(stmt)
CROSS APPLY stmt.nodes('.//IndexScan/Object[@Index=sql:variable("@IndexName")]') AS idx(obj)
OPTION(MAXDOP 1, RECOMPILE);
SELECT
dm_exec_query_plan.query_plan,
usecounts AS execution_count,
dm_exec_sql_text.text
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
INNER JOIN sys.dm_exec_query_stats
ON dm_exec_query_stats.plan_handle = dm_exec_cached_plans.plan_handle
CROSS APPLY sys.dm_exec_sql_text(dm_exec_query_stats.plan_handle)
WHERE CAST(dm_exec_query_plan.query_plan AS NVARCHAR(MAX)) LIKE '%index_you_are_looking_for%'
注意具有类似名称的索引,例如:named CIX_Customer_CreateDateand IX_CustomerAddresswill return from a search forLIKE '%IX_Customer%'
我建议使用
sys.dm_exec_text_query_plan
而不是sys.dm_exec_query_plan
. 使用sys.dm_exec_query_plan
你将丢失带有延迟编译的存储过程、长时间运行的存储过程(如果 SP 尚未完成但其使用给定索引的语句已经完成)和多语句 UDF。此外,您应该添加提示以避免可能对您的工作环境产生负面影响。
尝试这个:
CIX_Customer_CreateDate
andIX_CustomerAddress
will return from a search forLIKE '%IX_Customer%'
除了简单的文本搜索之外,您还可以使用 XQuery 过滤器,它可能更快或更慢。
或者,如果您只想要查询计划:
如有必要
@Database
,您还可以添加过滤器。@Schema
如果要从系统视图中复制索引名称,请确保使用它,
QUOTENAME
否则它将不匹配。