2009-04-27 15 views
30

Puedo ver el Plan de ejecución estimada (Management Studio 9.0) para una consulta sin problemas, pero cuando se trata de procedimientos almacenados, no veo una manera fácil de hacerlo sin copiar el código de la pantalla ALTER y pegarlo en una ventana de consulta; de lo contrario, mostrará el plan para ALTER y no el procedimiento. Incluso después de hacer esto, faltan entradas y necesitaría DECLARARlas como tales.¿Cómo puedo visualizar el plan de ejecución para un procedimiento almacenado?

¿Hay alguna manera más fácil de hacerlo en los procedimientos almacenados?

Editar: Pensé en algo que podría funcionar, pero no estoy seguro.

podía hacer el plan de ejecución estimado en

exec myStoredProc 234 

Respuesta

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

¿Por qué no está documentado en ningún lado? –

+0

'FMT_ONLY' no es una opción reconocida SET. –

+0

Creo que es FMTONLY no FMT_ONLY –

0

Ejecutar el procedimiento almacenado en el estudio de gestión (o analizador de consultas) con el plan de programa de ejecución real (desde el menú de consulta) habilitado le mostrará el plan para el procedimiento almacenado después de haberlo ejecutado. Si no puede ejecutarlo, hay un plan de ejecución estimado (aunque en mi experiencia a menudo es menos preciso).

+0

que se perdió el punto de mi pregunta. Cuando uso "mostrar el plan ejecutivo estimado", muestra el plan para el ALTER, no el procedimiento real. –

+0

Disculpa, no estaba claro. Quise decir "correr". Quise ejecutar el procedimiento almacenado en lugar de ejecutar el alter. En una nueva ventana exec MySP 'param1', 'param2' y configure la opción del plan de ejecución estimado – u07ch

+0

Ok, pero de cualquier manera no puedo ejecutar el procedimiento porque provocará cambios en mis datos. –

3

Al ejecutar un procedimiento almacenado en SQL Management Studio 2008, puede hacer clic en Consultar -> Incluir plan de ejecución real en el menú ... su también en la barra de herramientas

Después de leer los comentarios ejecución parece ser un problema y para resolver este problema, lo recomendaría envolver la ejecución del procedimiento almacenado en una transacción rodar de nuevo al final

+1

No puedo ejecutarlo sin embargo. Necesita ser estimado. –

+1

Podría envolverlo en una transacción y simplemente no cometer – Jon

+0

Idea interesante –

0

También puede usar Profiler para ver el plan de ejecución. Deberá incluir la opción Rendimiento: Mostrar perfil de estadísticas del plan y asegúrese de incluir datos binarios en sus columnas.

A continuación, puede ejecutar cualquier consulta o procedimiento y ver el plan de ejecución.

Editar

Si no puede utilizar perfilador, y no quiere abrir otra ventana Sugiero que se incluye un bloque de comentario en el comienzo de sus procedimientos almacenados. Por ejemplo imaginar el siguiente:

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

Lo que esto permite es que se puede destacar sólo los fines de ejecución y activar el plan de programa de ejecución. Y ejecutarlo.

+0

Desafortunadamente no tengo administrador SQL, así que no puedo usar el generador de perfiles. –

+0

De hecho, creo que puede ejecutar Profiler como no administrador si le otorgan los permisos adecuados. No estoy seguro de lo que son sin embargo. – JoshBerke

20

Seleccione el nombre StoredProcedure (sólo tienes que escribir en una ventana de consulta) y haga clic en el botón 'Mostrar plan de ejecución estimado' en la barra de herramientas de SQl Server Mgmt Studio. Nota que no tiene que tener abierto el código de procedimiento almacenado. Solo se debe seleccionar el nombre del procedimiento.

El plan para el procedimiento almacenado desde en en los procedimientos llamados también se mostrará en forma gráfica.

1

sé la respuesta fue presentado hace un tiempo pero me parece útil consulta siguiente

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

Supongo que esto da información histórica? Puede que no sea útil en nuevas extensiones –

+0

pruébelo, le da la versión sproc, el número de ejecuciones y los planes de consulta. –

+0

lo uso para solucionar problemas de sprocs donde el plan no se reutiliza –

Cuestiones relacionadas