我可以毫无问题地查看查询的估计执行计划(Management Studio 9.0),但是对于存储过程,如果不从 ALTER 屏幕复制代码并将其粘贴到查询窗口,否则它将显示 ALTER 的计划而不是过程。即使这样做了,任何输入都丢失了,我需要这样声明它们。
有没有更简单的方法可以在存储过程上做到这一点?
编辑: 我只是想到了一些可行的方法,但我不确定。
我可以做估计的执行计划吗
exec myStoredProc 234
我可以毫无问题地查看查询的估计执行计划(Management Studio 9.0),但是对于存储过程,如果不从 ALTER 屏幕复制代码并将其粘贴到查询窗口,否则它将显示 ALTER 的计划而不是过程。即使这样做了,任何输入都丢失了,我需要这样声明它们。
有没有更简单的方法可以在存储过程上做到这一点?
编辑: 我只是想到了一些可行的方法,但我不确定。
我可以做估计的执行计划吗
exec myStoredProc 234
SET SHOWPLAN_ALL ON
GO
-- FMTONLY will not exec stored proc
SET FMTONLY ON
GO
exec yourproc
GO
SET FMTONLY OFF
GO
SET SHOWPLAN_ALL OFF
GO
选择存储过程名称(只需在查询窗口中键入),右键单击,然后选择 SQl Server Mgmt Studio 工具栏中的“显示估计执行计划”按钮。 请注意,您不必打开存储过程代码。只需选择过程名称。
被调用过程中存储过程的计划也将以图形形式显示。
在 SQL Management Studio 2008 中执行存储过程时,您可以单击 Query -> Include Actual Execution Plan 从菜单中...它也在工具栏上
在阅读完评论后,执行似乎是一个问题,为了解决这个问题,我建议将存储过程的执行包装在最后回滚的事务中
采用
SET SHOWPLAN_ALL ON
Go
exec myStoredProc 234
GO
SET SHOWPLAN_ALL OFF
GO
请参阅http://msdn.microsoft.com/en-us/library/aa259203.aspx 只要您不使用 tmp 表,我认为这将起作用
我知道答案是不久前提交的,但我发现下面的查询很有用
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT [ProcedureName] = OBJECT_NAME([ps].[object_id], [ps].[database_id])
,[ProcedureExecutes] = [ps].[execution_count]
,[VersionOfPlan] = [qs].[plan_generation_num]
,[ExecutionsOfCurrentPlan] = [qs].[execution_count]
,[Query Plan XML] = [qp].[query_plan]
FROM [sys].[dm_exec_procedure_stats] AS [ps]
JOIN [sys].[dm_exec_query_stats] AS [qs] ON [ps].[plan_handle] = [qs].[plan_handle]
CROSS APPLY [sys].[dm_exec_query_plan]([qs].[plan_handle]) AS [qp]
WHERE [ps].[database_id] = DB_ID()
AND OBJECT_NAME([ps].[object_id], [ps].[database_id]) = 'TEST'
有很多方法可以获取存储过程的实际执行计划。
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 查询并不是每天最常做的事情,字符串通配符对每个人来说都很容易。
在启用显示实际执行计划(从查询菜单)的情况下在管理工作室(或查询分析器)中运行存储过程将在您运行存储过程后向您显示存储过程的计划。如果您无法运行它,则会显示估计的执行计划(尽管根据我的经验,这通常不太准确。)
您还可以使用 Profiler 查看执行计划。您需要包括 Performance : Show Plan Statistics Profile 选项,并确保在列中包含二进制数据。
然后,您可以运行任何查询或过程并查看执行计划。
编辑
如果您不能使用分析器,并且您不想打开另一个窗口,我建议您在存储过程的开头包含一个注释块。例如想象以下情况:
/*
Description: This procedure does XYZ etc...
DevelopedBy: Josh
Created On: 4/27/09
Execution: exec my_procName N'sampleparam', N'sampleparam'
*/
ALTER PROCEDURE my_procName
@p1 nvarchar(20),
@p2 nvarchar(20)
AS
这允许您仅突出显示执行目的并打开显示执行计划。并运行它。