Comment profiler des procédures stockées


26

J'utilise SQL Server 2012 et je me demandais comment profiler les procédures stockées

Par exemple, le profileur peut-il capturer chaque instruction SQL individuelle dans une procédure stockée, ce qu'elle est et combien de temps cela prend pour s'exécuter, etc.?

J'essaie de diagnostiquer les procédures stockées de réplication de fusion, et cela doit être capturé dans le cadre d'une exécution complète de l'agent de fusion. Il ne semble pas possible de récupérer la procédure stockée avec des problèmes de performances et de la réexécuter car à ce stade, elle n'est pas lente.

Réponses:


27

La réponse de Kevin décrit les événements à capturer dans SQL Trace / SQL Profiler. Pour développer un peu cette réponse - SP:StmtCompletedvous montrera chaque instruction dans une procédure stockée en cours d'achèvement, comme cela semble.

De plus, si vous êtes sur un système occupé et que vous essayez de diagnostiquer un problème de performances, vous devez être prudent avec SQL Profiler. SQL Profiler est beaucoup plus lent que le traçage d'un fichier ou l'utilisation d'événements étendus. Ce billet de blog de Jonathan Kehayias montre une surcharge d' environ 90% sur les performances d'un système à l'aide de SQL Profiler et une surcharge d'environ 10% du suivi au fichier. Moins pour les événements prolongés. C'est pourquoi il est généralement recommandé de ne pas exécuter SQL Profiler lui-même

Bien que ces informations soient disponibles via les événements étendus, je suggère d'utiliser toujours SQL Trace (la technologie derrière SQL Profiler) mais à suivre un fichier à la place(si vous vouliez investir dans l'apprentissage et l'utilisation des événements étendus, ce serait la voie à suivre, dans une future version de SQL Server SQL Trace aura disparu et tout ce que nous aurons sera des événements étendus). Je vous suggère également de filtrer via le bouton Filtres de colonne autant de bruit de fond que possible pour vous assurer que vous capturez uniquement ce qui est nécessaire. Vous pouvez configurer votre trace avec l'outil Profiler en suivant les étapes décrites par Kevin dans sa bonne réponse, puis ajouter un filtre à partir de la même interface graphique. Ensuite, vous pouvez exporter la trace en tant que script et exécuter ce script sur le traçage SQL Server vers un fichier sur un dossier qui ne contient pas de fichiers de base de données ou de journal des transactions. Pour exporter, vous devez simplement configurer votre trace, l'exécuter pendant quelques secondes pour vous assurer de capturer ce que vous voulez, l'arrêter, puis aller dans la barre de menus et ->File->ExportScript Trace Definitionet enregistrez le fichier. Ouvrez ensuite ce fichier dans une nouvelle fenêtre de requête sur le serveur que vous souhaitez suivre. Vous pouvez en savoir plus sur les options et les définitions de ce script que vous avez créé en consultant les articles d'aide pour les différentes procédures stockées utilisées dans ce script que vous venez de créer en commençant ici .

Si vous avez le temps et que vous souhaitez apprendre, vous pouvez également lire certains articles sur les événements étendus et voir comment capturer les informations également. Jonathan Kehayias est une excellente ressource pour les articles de blog lorsque vous êtes prêt à commencer là-bas.


2
Qu'en est-il lorsqu'un SP: StmtCompleted affiche simplement "- Texte crypté" dans le texte de la requête? Comment savoir à quelles tables on accède?
Brain2000

Avoir le même problème que vous @ Brain2000 ....
wenzzzel

21

Vous pouvez capturer les instructions individuelles dans une procédure stockée via SQL Server Profiler. Pour ce faire, dans votre onglet Sélection d'événements, cochez la case "Afficher tous les événements". Faites ensuite défiler la liste jusqu'à la catégorie Procédures stockées et cochez la case en regard de SP: StmtCompleted . Si vous avez également sélectionné les événements SQL: BatchStarted et SQL: BatchCompleted , vous pouvez obtenir une image du début à la fin d'une exécution de procédure stockée, en les liant tous ensemble par SPID.

Il peut également être utile d'examiner le cache du plan pour voir si vous pouvez obtenir un plan de requête pour votre procédure à exécution lente. Vous pouvez commencer par quelque chose comme ceci:

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';
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.