Je corrige des problèmes de performances sur une procédure stockée à plusieurs états dans SQL Server. Je veux savoir sur quelle (s) partie (s) je dois passer du temps.
Je comprends de Comment lire le coût de la requête, et est-ce toujours un pourcentage? que même lorsque SSMS est invité à inclure le plan d'exécution réel , les chiffres du "coût de la requête (par rapport au lot)" sont toujours basés sur des estimations de coûts , qui peuvent être très éloignées des chiffres réels
D'après la mesure des performances des requêtes: «Execution Plan Query Cost» vs «Time Taken», je comprends que je peux entourer l'invocation de la procédure stockée d' SET STATISTICS TIME
instructions, et j'obtiendrai ensuite une liste comme celle-ci dans le Messages
volet:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
[etc]
SQL Server Execution Times:
CPU time = 187 ms, elapsed time = 206 ms.
avec un message de sortie pour chaque instruction.
Je peux `` facilement '' (mais pas commodément) associer la sortie des statistiques de temps aux plans d'exécution instruction par instruction dans le volet Plan d'exécution, en les comptant: la quatrième SQL Server Execution Times
sortie de message correspond à Query 4
dans le volet Plan d'exécution, etc.
Mais y a-t-il une meilleure façon?
Duration
et lesCPU
résultats sont des chiffres réels plutôt que des estimations, oui?Une bonne façon de le faire est avec Profiler. Configurez une "repro" de votre problème sur un dev ou une boîte de test, c'est-à-dire un exemple d'appel au proc avec des paramètres. Ensuite, à l'aide de Profiler, créez une trace à l'aide du modèle TSQL_SPs ou à partir d'un modèle vierge, ajoutez l'événement SP: StmtCompleted. Ajoutez les colonnes Durée, Lectures, Écritures et CPU si elles ne sont pas déjà disponibles. Ajoutez un filtre à la trace sur votre SPID (que vous devez connaître dans Management Studio). Vous pouvez également ajouter un filtre à la durée (par exemple supérieur à 1000 = supérieur à 1 seconde).
Vous pouvez soit exécuter la trace dans le Générateur de profils bien qu'il y ait des frais généraux (ne PAS faire cela sur une boîte de production) ou exporter la définition et créer une trace côté serveur. La surcharge du profileur n'est pas vraiment un problème sur une boîte de développement ou de test dédiée.
Exécutez le proc et laissez-le terminer. Vous pouvez également choisir de collecter le plan d'exécution réel à ce stade.
Arrêtez votre trace et ouvrez le fichier, et vous devriez voir une ventilation ligne par ligne de votre proc, y compris les horaires pour chaque étape. Je trouve cela plus utile que le plan pour identifier les goulots d'étranglement, bien que le plan vous soit utile lorsque vous examinerez les sections pertinentes à régler.
HTH
la source
Vous pouvez également utiliser les vues de gestion dynamique sys.dm_exec_procedure_stats et sys.dm_exec_query_stats . La première donne des informations sur la procédure dans son ensemble; la seconde peut être utilisée pour décomposer chaque requête de la procédure. Un exemple est illustré ci-dessous:
Statistiques de procédure:
Requêtes dans la procédure:
la source