Как я могу отобразить план выполнения хранимой процедуры? - PullRequest
38 голосов
/ 27 апреля 2009

Я могу просмотреть примерный план выполнения (Management Studio 9.0) для запроса без проблем, но когда дело доходит до хранимых процедур, я не вижу простого способа сделать это без копирования кода с экрана ALTER и вставки это в окне запроса, в противном случае он покажет план для ALTER, а не процедуры. Даже после этого все входные данные отсутствуют, и мне нужно ОБЪЯВИТЬ их как таковые.

Есть ли более простой способ сделать это для хранимых процедур?

Edit: Я просто подумал о том, что может сработать, но я не уверен.

Могу ли я сделать примерный план выполнения на

exec myStoredProc 234

Ответы [ 8 ]

41 голосов
/ 28 апреля 2009
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
23 голосов
/ 20 мая 2011

Выберите имя хранимой процедуры (просто введите его в окне запроса), щелкните правой кнопкой мыши и выберите кнопку «Показать примерный план выполнения» на панели инструментов SQl Server Mgmt Studio. Обратите внимание , что вам не нужно открывать код хранимой процедуры. Необходимо выбрать только имя процедуры.

План хранимой процедуры из с в вызываемых процедурах также будет отображаться в графической форме.

3 голосов
/ 28 апреля 2009

Используйте

SET SHOWPLAN_ALL ON
Go
exec myStoredProc 234
GO
SET SHOWPLAN_ALL OFF
GO

См. http://msdn.microsoft.com/en-us/library/aa259203.aspx Пока вы не используете таблицы tmp, я думаю, что это будет работать

3 голосов
/ 27 апреля 2009

При выполнении хранимой процедуры в SQL Management Studio 2008 вы можете щелкнуть Запрос -> Включить фактический план выполнения из меню ... его также на панели инструментов

После прочтения комментариев выполнение, похоже, является проблемой, и для ее решения я бы рекомендовал обернуть выполнение хранимой процедуры в транзакцию, откатывая ее в конце

2 голосов
/ 26 апреля 2017

Я знаю, что ответ был отправлен некоторое время назад, но я считаю, что запрос ниже полезен

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'
1 голос
/ 04 апреля 2018

Вот скриншот. Мне понадобилось время, чтобы выяснить, где искать.

enter image description here

0 голосов
/ 27 апреля 2009

Вы также можете использовать Profiler для просмотра плана выполнения. Вы захотите включить параметр «Производительность: Показать профиль статистики плана» и обязательно включите двоичные данные в свои столбцы.

Затем можно выполнить любой запрос или процедуру и просмотреть план выполнения.

Редактировать

Если вы не можете использовать профилировщик и не хотите открывать другое окно, я предлагаю вам включить блок комментариев в начале ваших сохраненных процедур. Например, представьте следующее:

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

Это позволяет вам выделять только цель выполнения и включать показывать план выполнения. И запустить его.

0 голосов
/ 27 апреля 2009

Запуск хранимой процедуры в Management Studio (или анализаторе запросов) с включенным показом фактического плана выполнения (из меню запросов) покажет вам план для хранимой процедуры после ее запуска. Если вы не можете запустить его, покажите примерный план выполнения (хотя, по моему опыту, он часто менее точен).

...