2009-04-27 44 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' 
相關問題