2009-04-27 41 views
30

我可以查看估计执行计划(Management Studio中9.0)的查询没有问题,但是当涉及到存储过程我没有看到一个简单的方法来做到这一点,而不从ALTER屏幕复制代码,并将其粘贴进入查询窗口,否则将显示ALTER的计划而不是程序。即使这样做后,任何输入都会丢失,我需要声明它们。如何显示存储过程的执行计划?

是否有更简单的方法来做到这一点的存储过程?

编辑: 我只是想到了一些可能工作,但我不知道。

我可以做

exec myStoredProc 234 

回答

31
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 
0

估计执行计划运行管理工作室(或查询分析器)与显示实际执行计划的存储过程(从查询菜单)功能会告诉你的计划存储过程后,你已经运行它。如果你不能在它上面运行的是显示估计的执行计划(虽然在我的经验,往往是不准确的。)

+0

查询你错过了我的问题点。当我使用“显示预计的执行计划”时,它显示了ALTER的计划,而不是实际的程序。 – 2009-04-27 17:23:24

+0

对不起,我不清楚我的意思是运行我的意思是运行存储过程,而不是运行更改。在新窗口中 exec MySP'param1','param2' 并设置预计执行计划选项 – u07ch 2009-04-27 17:28:23

+0

好吧,但无论如何我无法运行该过程,因为它会导致我的数据发生变化。 – 2009-04-27 17:37:24

3

当SQL管理执行存储过程2008年Studio中,您可以点击查询 - >包括从菜单中实际执行计划...它也在工具栏上

通过阅读意见执行似乎是一个问题,并解决这个问题,我会建议将存储过程的执行包裹在一个事务中滚动回到底

+1

虽然我实际上不能运行它。它需要估计。 – 2009-04-27 17:24:15

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 

什么这使的是,你可以仅仅强调执行目的,并打开显示的执行计划。并运行它。

20

选择StoredProcedure的名字(只是在查询窗口中键入它)然后单击SQl Server Mgmt Studio工具栏中的“显示预计执行计划”按钮。 注意,你不必有存储过程的代码开放。只需选择过程名称即可。

从与被叫程序的存储过程的计划也将被以图形形式显示。

1

我知道答案前一阵子提交过,但我觉得以下有用

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' 
相关问题