我可以毫无问题地查看查询的估计执行计划(Management Studio 9.0)但是当涉及到存储过程时,我没有看到一种简单的方法来执行此操作而不从ALTER屏幕复制代码并粘贴它进入查询窗口,否则它将显示ALTER的计划而不是程序。即使在这样做之后,任何输入都会丢失,我需要将它们作为DECLARE。
在存储过程中有更简单的方法吗?
修改 我只想到了一些可行的东西,但我不确定。
我可以在
上执行估算的执行计划吗?exec myStoredProc 234
答案 0 :(得分:41)
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
答案 1 :(得分:23)
选择storedprocedure名称(只需在查询窗口中输入),右键单击,然后选择SQl Server Mgmt Studio工具栏中的“显示估计执行计划”按钮。 注意您不必打开存储过程代码。只需要选择程序名称。
在被调用程序中使用存储过程的计划也将以图形形式显示。
答案 2 :(得分:3)
在SQL Management Studio 2008中执行存储过程时,可以单击“查询” - >从菜单中包括实际执行计划......它也在工具栏上
阅读完评论后,执行似乎是一个问题,为了解决这个问题,我建议在最后回滚的事务中包装存储过程的执行
答案 3 :(得分:3)
使用
SET SHOWPLAN_ALL ON
Go
exec myStoredProc 234
GO
SET SHOWPLAN_ALL OFF
GO
参见http://msdn.microsoft.com/en-us/library/aa259203.aspx 只要您不使用tmp表我认为这将起作用
答案 4 :(得分:2)
我知道答案是在不久前提交的,但我发现下面的查询很有用
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'
答案 5 :(得分:1)
答案 6 :(得分:1)
有很多方法可以获取存储过程的实际执行计划。
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查询并不是每天最多要做的事情,并且字符串通配符对每个人都很容易。
答案 7 :(得分:0)
在启用了显示实际执行计划(来自查询菜单)的management studio(或查询分析器)中运行存储过程将在运行后显示存储过程的计划。如果您无法运行它,则会显示估计的执行计划(尽管根据我的经验,这通常不太准确。)
答案 8 :(得分:0)
您还可以使用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
这允许您只强调执行目的并启用show执行计划。并运行它。