web-dev-qa-db-fra.com

Comment profiler des procédures stockées

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 saisir 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.

29
peter

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:StmtCompleted vous 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 article de blog par Jonathan Kehayias montre environ 90% de surcharge sur les performances d'un système à l'aide de SQL Profiler et environ 10% de surcharge de traçage dans un fichier. Moins pour les événements étendus. 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 de suivre un fichier à la place (si vous voulait 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. Vous pouvez ensuite 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 que vous capturez ce que vous voulez, l'arrêter, puis aller dans la barre de menus et File -> Export -> Script Trace Definition et 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 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 démarrant ici .

Si vous avez le temps et que vous souhaitez apprendre, vous pouvez également lire quelques 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.

27
Mike Walsh

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". Ensuite, faites défiler jusqu'à la catégorie Procédures stockées et cochez la case à côté de SP: StmtCompleted. Si vous avez également les événements SQL: BatchStarted et SQL: BatchCompleted sélectionnés, 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';
22
Kevin Feasel