2009-04-27 4 views
30

Sono in grado di visualizzare il piano di esecuzione stimato (Management Studio 9.0) per una query senza problemi, ma quando si tratta di stored procedure non vedo un modo semplice per farlo senza copiare il codice dallo schermo ALTER e incollandolo in una finestra di query, altrimenti mostrerà il piano per ALTER e non la procedura. Anche dopo averlo fatto, mancano tutti gli input e dovrei DICHIARARLI come tali.Come posso visualizzare il piano di esecuzione per una procedura memorizzata?

Esiste un modo più semplice per eseguire questa operazione sulle stored procedure?

Modifica: Ho pensato a qualcosa che potrebbe funzionare ma non ne sono sicuro.

potevo fare il piano di esecuzione stimato sulla

exec myStoredProc 234 

risposta

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

Perché questo non è documentato da nessuna parte? –

+0

'FMT_ONLY' non è un'opzione SET riconosciuta. –

+0

Penso che sia FMTONLY non FMT_ONLY –

0

Esecuzione della stored procedure in studio di gestione (o Query Analyzer) con piano di esposizione effettiva esecuzione (dal menu query) abilitata vi mostrerà il piano di stored procedure dopo averlo eseguito. Se non è possibile eseguirlo, viene visualizzato il piano di esecuzione stimato (sebbene nella mia esperienza sia spesso meno accurato)

+0

È mancato il punto della mia domanda. Quando uso "show stimato exec piano" mostra il piano per ALTER, non la procedura effettiva. –

+0

Mi spiace di non essere chiaro intendevo correre intendevo dire eseguire la stored procedure piuttosto che eseguire l'alter. In una nuova finestra exec MySP 'param1', 'param2' e impostare l'opzione piano di esecuzione stimata – u07ch

+0

Ok, ma in entrambi i casi non è possibile eseguire la procedura perché causerà modifiche ai miei dati. –

3

Quando si esegue una stored procedure in SQL Management Studio 2008, è possibile fare clic su Query -> Includi piano di esecuzione reale dal menu ... la sua anche sulla barra degli strumenti

Dopo aver letto i vari commenti esecuzione sembra essere un problema e per risolvere questo problema che consiglierei avvolgendo l'esecuzione della stored procedure in una transazione rotolare di nuovo alla fine

+1

Tuttavia non riesco a eseguirlo. Deve essere stimato. –

+1

È possibile eseguire il wrap in una transazione e non eseguire il commit – Jon

+0

Idea interessante –

0

È inoltre possibile utilizzare Profiler per visualizzare il piano di esecuzione. Ti consigliamo di includere l'opzione Performance: Mostra profilo statistiche del piano e assicurati di includere i dati binari nelle colonne.

È quindi possibile eseguire qualsiasi query o procedura e visualizzare il piano di esecuzione.

Modifica

Se non è possibile utilizzare profiler, e non si vuole aprire un'altra finestra vi suggerisco di includere un blocco di commento all'inizio del vostri stored procedure. Ad esempio, immagina quanto segue:

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

Ciò che consente è che è possibile evidenziare solo lo scopo di esecuzione e attivare il piano di esecuzione dello spettacolo. E eseguilo.

+0

Purtroppo non ho l'amministratore SQL, quindi non posso usare il profiler. –

+0

In realtà penso che tu possa eseguire profiler come non amministratore se hai le giuste autorizzazioni. Non sono sicuro di quello che sono comunque. – JoshBerke

20

Selezionare il nome StoredProcedure (basta digitare in una finestra di query) e fai clic sul pulsante "Visualizza piano di esecuzione stimato" nella barra degli strumenti di SQl Server Mgmt Studio. Nota: non è necessario che il codice di procedura memorizzato sia aperto. È necessario selezionare solo il nome della procedura.

Anche il piano per la procedura memorizzata da con nelle procedure richiamate verrà visualizzato in forma grafica.

1

so risposta è stata presentata qualche tempo fa, ma trovo domanda sotto utile

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

Presumo che questo dia informazioni storiche? Potrebbe non essere utile su nuovi sproc ... –

+0

provarlo, fornisce la versione sproc, il numero di esecuzioni e piani di query. –

+0

lo utilizzo per risolvere sprocs in cui il piano non viene riutilizzato –

Problemi correlati