Come profilare le procedure memorizzate


26

Sto usando SQL Server 2012 e mi chiedevo come profilare le stored procedure

Ad esempio, il profiler può acquisire ogni singola istruzione SQL in una procedura memorizzata, di cosa si tratta e quanto tempo richiede l'esecuzione, ecc.?

Sto cercando di diagnosticare le stored procedure di replica di tipo merge e questo deve essere acquisito durante un'intera esecuzione dell'agente di merge. Non sembra possibile afferrare la procedura memorizzata con problemi di prestazioni ed eseguirla nuovamente perché a quel punto non è lenta.

Risposte:


27

La risposta di Kevin descrive quali eventi acquisire in SQL Trace / SQL Profiler. Espandere un po 'quella risposta - SP:StmtCompletedti mostrerà ogni istruzione all'interno di una procedura memorizzata in fase di completamento, come sembra.

Inoltre, se sei su un sistema occupato e stai provando a diagnosticare un problema di prestazioni, dovresti fare attenzione con SQL Profiler. SQL Profiler è molto più lento della traccia in un file o dell'uso di Eventi estesi. Questo post sul blog di Jonathan Kehayias mostra un sovraccarico del 90% sulle prestazioni di un sistema derivante dall'utilizzo di SQL Profiler e un sovraccarico del 10% dalla traccia su file. Meno per eventi estesi. Questo è il motivo per cui si consiglia in genere di non eseguire SQL Profiler stesso mentre

Mentre queste informazioni sono disponibili tramite gli eventi estesi, suggerirei di utilizzare ancora SQL Trace (la tecnologia dietro SQL Profiler) ma invece di tracciare su un file(se vuoi investire nell'apprendimento e nell'uso degli Eventi estesi, questa sarebbe la strada da percorrere, in una versione futura di SQL Server SQL Trace sparirà e tutto ciò che avremo saranno gli Eventi estesi). Suggerirei inoltre di filtrare attraverso il pulsante Filtri colonna il più possibile il rumore di fondo per essere sicuro di catturare solo ciò che è necessario. Puoi impostare la tua traccia con lo strumento Profiler usando i passaggi descritti da Kevin nella sua buona risposta e quindi aggiungere un filtro dalla stessa GUI. Quindi è possibile esportare la traccia come script ed eseguire quello script sulla traccia di SQL Server in un file in una cartella che non contiene database o file di registro delle transazioni. Per esportare, dovresti semplicemente impostare la tua traccia, eseguirla per alcuni secondi per assicurarti di catturare ciò che desideri, fermarlo e quindi andare alla barra dei menu e File->Export-> Script Trace Definitione salva il file. Quindi apri quel file in una nuova finestra di query sul server che intendi tracciare. Puoi vedere di più sulle opzioni e le definizioni di questo script che hai creato guardando gli articoli della guida per le varie procedure memorizzate utilizzate in quello script che hai appena creato iniziando qui .

Se hai tempo e vuoi imparare, puoi anche leggere alcuni articoli su Eventi estesi e vedere come acquisire anche le informazioni. Jonathan Kehayias è una grande risorsa per i post sul blog quando sei pronto per iniziare lì.


2
Che dire quando un SP: StmtCompleted mostra solo "- Testo crittografato" nel testo della query? Come possiamo scoprire a quali tabelle si accede?
Brain2000,

Avere lo stesso problema come te @ Brain2000 ....
wenzzzel,

21

È possibile acquisire le singole istruzioni in una procedura memorizzata tramite SQL Server Profiler. Per fare ciò, nella scheda Selezione eventi, fai clic sulla casella di controllo "Mostra tutti gli eventi". Quindi, scorrere verso il basso fino alla categoria Stored Procedures e selezionare la casella accanto a SP: StmtCompleted . Se sono selezionati anche gli eventi SQL: BatchStarted e SQL: BatchCompleted , è possibile ottenere un'immagine dall'inizio alla fine dell'esecuzione di una procedura memorizzata, collegando tutti insieme da SPID.

Potrebbe anche essere utile esaminare la cache del piano per vedere se è possibile ottenere un piano di query per la procedura a esecuzione lenta. Potresti iniziare con qualcosa del genere:

SELECT 
    OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
    cp.usecounts AS ExecutionCount,
    st.TEXT AS QueryText,
    qp.query_plan AS QueryPlan
FROM 
    sys.dm_exec_cached_plans AS cp
    CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE 
    cp.objtype = 'Proc'
    AND OBJECT_NAME(st.objectid,st.dbid) = 'YourStoredProcedure';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.