2009-04-27 31 views
30

Tôi có thể xem Kế hoạch thực hiện ước tính (Management Studio 9.0) cho truy vấn mà không gặp vấn đề gì, nhưng khi nói đến các thủ tục đã lưu, tôi không thấy cách dễ dàng để thực hiện việc này mà không sao chép mã từ màn hình ALTER và dán nó vào một cửa sổ truy vấn, nếu không nó sẽ hiển thị kế hoạch cho ALTER và không phải là thủ tục. Ngay cả sau khi làm điều này, bất kỳ đầu vào là mất tích và tôi sẽ cần phải DECLARE chúng như vậy.Làm thế nào tôi có thể hiển thị kế hoạch thực hiện cho một thủ tục lưu sẵn?

Có cách nào dễ dàng hơn để thực hiện việc này trên các thủ tục được lưu trữ không?

Chỉnh sửa: Tôi chỉ nghĩ về điều gì đó có thể hiệu quả nhưng tôi không chắc chắn.

Tôi có thể làm kế hoạch thực hiện ước tính trên

exec myStoredProc 234 

Trả lời

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

Tại sao tài liệu này không được ghi ở bất cứ đâu? –

+0

'FMT_ONLY' không phải là tùy chọn SET được công nhận. –

+0

Tôi nghĩ rằng đó là FMTONLY không FMT_ONLY –

0

Chạy thủ tục lưu trữ trong studio quản lý (hoặc phân tích truy vấn) với kế hoạch chương trình thực hiện thực tế (từ menu query) được kích hoạt sẽ cho bạn thấy những kế hoạch cho thủ tục lưu trữ sau khi bạn đã chạy nó. Nếu bạn không thể chạy nó có hiển thị kế hoạch thực hiện ước tính (mặc dù trong kinh nghiệm của tôi mà thường ít chính xác hơn.)

+0

Bạn bị mất điểm của câu hỏi của tôi. Khi tôi sử dụng "hiển thị kế hoạch thực hiện ước tính" nó cho thấy kế hoạch cho ALTER, không phải là thủ tục thực tế. –

+0

Xin lỗi tôi không rõ ràng tôi có nghĩa là chạy tôi có nghĩa là chạy các thủ tục được lưu trữ hơn là chạy thay đổi. Trong một cửa sổ mới exec MySP 'param1', 'param2' và đặt tùy chọn kế hoạch thực hiện ước tính – u07ch

+0

Ok, nhưng một trong hai cách tôi không thể chạy thủ tục vì nó sẽ gây ra thay đổi cho dữ liệu của tôi. –

3

Khi thực hiện một thủ tục được lưu trữ trong SQL Management Studio 2008 bạn có thể bấm truy vấn -> Bao gồm thực tế thực hiện kế hoạch từ trình đơn ... nó cũng trên thanh công cụ

Sau khi đọc qua các ý kiến ​​thực hiện có vẻ là một vấn đề và để giải quyết vấn đề này tôi sẽ khuyên bạn nên gói thực hiện các thủ tục lưu trữ trong một giao dịch lăn nó trở lại vào cuối

+1

Tôi thực sự không thể chạy nó mặc dù. Nó cần phải được ước tính. –

+1

Bạn có thể bọc nó trong một giao dịch và chỉ không cam kết – Jon

+0

Ý tưởng thú vị –

0

Bạn cũng có thể sử dụng Profiler để xem kế hoạch thực hiện. Bạn sẽ muốn bao gồm tùy chọn Performance: Show Plan Statistics Profile và chắc chắn inlcude Binary Data trong các cột của bạn.

Sau đó, bạn có thể chạy bất kỳ truy vấn hoặc thủ tục nào và xem kế hoạch thực hiện.

Sửa

Nếu bạn không thể sử dụng hồ sơ, và bạn không muốn mở một cửa sổ tôi đề nghị bạn nên bao gồm một khối bình luận vào đầu procs lưu trữ của bạn. Ví dụ: hãy tưởng tượng những điều sau:

/* 
    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 

Điều này cho phép bạn có thể làm nổi bật mục đích thực hiện và bật hiển thị kế hoạch thực hiện. Và chạy nó.

+0

Thật không may là tôi không có quản trị viên SQL nên tôi không thể sử dụng profiler. –

+0

Tôi thực sự nghĩ rằng bạn có thể chạy hồ sơ với tư cách là người không phải là quản trị viên nếu bạn đã cấp quyền phù hợp. Tuy nhiên, bạn không chắc chắn về những điều đó. – JoshBerke

20

Chọn tên StoredProcedure (chỉ cần gõ nó trong một cửa sổ truy vấn) và nhấp vào nút 'Hiển thị Kế hoạch Thực hiện Ước tính' trong thanh công cụ của Máy chủ Quản lý Máy chủ SQl. Lưu ý mà bạn không phải mở mã thủ tục được lưu trữ. Chỉ cần chọn tên thủ tục.

Kế hoạch cho thủ tục lưu sẵn từ trong các thủ tục được gọi cũng sẽ được hiển thị dưới dạng đồ họa.

1

Tôi biết câu trả lời đã được gửi một thời gian trước, nhưng tôi thấy truy vấn hữu ích dưới đây

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' 
+0

Tôi cho rằng điều này cung cấp thông tin lịch sử? Có thể không hữu ích trên các sprocs mới –

+0

cho nó một thử, nó cung cấp cho phiên bản sproc, số lượng thực thi và kế hoạch truy vấn. –

+0

tôi sử dụng nó để khắc phục sự cố sprocs nơi kế hoạch không được sử dụng lại –

Các vấn đề liên quan