有很多方法可以获取存储过程的实际执行计划。
SELECT
qp.query_plan,
SQLText.text
FROM sys.dm_exec_cached_plans AS CP
CROSS APPLY sys.dm_exec_sql_text( plan_handle)AS SQLText
CROSS APPLY sys.dm_exec_query_plan( plan_handle)AS QP
WHERE objtype = 'Proc' and cp.cacheobjtype = 'Compiled Plan'
使用生产服务器中的数据统计信息查看生产服务器上的计划可能会显示与具有较小数据集的开发盒不同的计划。
还有很多数据要查看,例如根据查询缓存执行过程的频率
SELECT
qp.query_plan,
CP.usecounts as [Executed],
DB_name(QP.dbid) as [Database],
OBJECT_NAME(QP.objectid) as [Procedure],
SQLText.text as [TSQL],
so.create_date as [Procedure Created],
so.modify_date as [Procedure Modified]
FROM sys.dm_exec_cached_plans AS CP
CROSS APPLY sys.dm_exec_sql_text( plan_handle)AS SQLText
CROSS APPLY sys.dm_exec_query_plan( plan_handle)AS QP
join sys.objects as so on so.[object_id]=QP.objectid
WHERE objtype = 'Proc' and cp.cacheobjtype = 'Compiled Plan'
XML 查询计划(两个查询中的第一列),包含执行计划的 XML,允许您在 SSMS 中单击它并查看实际计划,但也允许您扫描您不喜欢的事情有索引扫描或“上帝禁止”表扫描。
SELECT
qp.query_plan,
CP.usecounts as [Executed],
DB_name(QP.dbid) as [Database],
OBJECT_NAME(QP.objectid) as [Procedure],
SQLText.text as [TSQL],
so.create_date as [Procedure Created],
so.modify_date as [Procedure Modified]
FROM sys.dm_exec_cached_plans AS CP
CROSS APPLY sys.dm_exec_sql_text( plan_handle)AS SQLText
CROSS APPLY sys.dm_exec_query_plan( plan_handle)AS QP
join sys.objects as so on so.[object_id]=QP.objectid
WHERE objtype = 'Proc' and cp.cacheobjtype = 'Compiled Plan'
and cast(qp.query_plan as nvarchar(max)) like '%loop%'
我使用一种非常糟糕的方式进行采样,将 XML 转换为字符串,然后进行通配符搜索,但是 XML 查询并不是每天最常做的事情,字符串通配符对每个人来说都很容易。