如何显示存储过程的执行计划?

时间:2009-04-27 17:06:50

标签: sql-server stored-procedures optimization ssms

我可以毫无问题地查看查询的估计执行计划(Management Studio 9.0)但是当涉及到存储过程时,我没有看到一种简单的方法来执行此操作而不从ALTER屏幕复制代码并粘贴它进入查询窗口,否则它将显示ALTER的计划而不是程序。即使在这样做之后,任何输入都会丢失,我需要将它们作为DECLARE。

在存储过程中有更简单的方法吗?

修改 我只想到了一些可行的东西,但我不确定。

我可以在

上执行估算的执行计划吗?
exec myStoredProc 234

9 个答案:

答案 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)

这是一个截图。请稍等一下,找出要去的地方。

enter image description here

答案 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执行计划。并运行它。