58 votes

Comment trouver les requêtes les plus lentes

En utilisant Sql Server 2005 Profiler, quels sont les événements, colonnes et filtres que vous tracez pour trouver vos requêtes et procédures stockées les plus lentes ?

Lenteur = supérieure à N secondes, 10 pour l'exemple.

0 votes

Définissez "lent". Une requête peut être lente, mais cela ne concerne que le nombre d'appels effectués et leur caractère critique ou non.

111voto

u07ch Points 5303

En SQL 2005, vous pouvez utiliser les vues de gestion pour trouver les requêtes qui s'exécutent lentement. Un bon script que j'ai trouvé il y a un certain temps sur Performances du serveur SQL vous aidera à démarrer ; il liste les données en commençant par les plus lentes.

SELECT  creation_time 
        ,last_execution_time
        ,total_physical_reads
        ,total_logical_reads 
        ,total_logical_writes
        , execution_count
        , total_worker_time
        , total_elapsed_time
        , total_elapsed_time / execution_count avg_elapsed_time
        ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
         ((CASE statement_end_offset
          WHEN -1 THEN DATALENGTH(st.text)
          ELSE qs.statement_end_offset END
            - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY total_elapsed_time / execution_count DESC;

1 votes

Connaissez-vous l'unité de mesure des temps : total_worker_time, total_elapsed_time, et avg_elapsed_time ?

6 votes

Les temps sont en microsecondes ; MSDN a une bonne ventilation sur la vue de gestion. msdn.microsoft.com/fr/us/library/ms189741.aspx

1 votes

Oui, ces DMV sont excellents, mais ils sont aussi DYNAMIQUES, comme leur nom l'indique, c'est-à-dire qu'ils sont vidés à chaque fois que le serveur démarre. Si votre serveur est redémarré chaque nuit, ces données ne représentent pas un échantillon très fiable pour un jour donné. Traitez donc ces mesures avec précaution - elles sont dynamiques et peuvent être basées sur un échantillon assez réduit...

15voto

Andomar Points 115404

Avant d'utiliser le profileur, je vérifie les rapports d'utilisation intégrés. Faites un clic droit sur une base de données, Rapports, Rapports standard, puis Statistiques d'exécution des objets.

Elle liste les plans d'exécution actuellement mis en cache, ainsi que la quantité de ressources et le nombre de fois qu'ils ont été exécutés. Cela donne généralement une très bonne idée de ce qui occupe le serveur.

1 votes

@Andomar, est-il possible d'exécuter ce rapport sur un serveur de production ? J'ai essayé d'exécuter ce rapport sur l'un de mes serveurs de production, et il indique toujours "retreiving data" après une minute. Je l'ai arrêté par sécurité.

1 votes

@Bill Paetzke : Le rapport devrait être sûr pour la production, même s'il est assez long. Si vous n'avez pas confiance, vous pouvez vérifier la liste des processus pour les problèmes de blocage !

4voto

gbjbaanb Points 31045

La colonne de la durée me suffit, mais je regarde aussi parfois les colonnes des lectures et des écritures.

J'utilise le filtre TSQL:StmtCompleted pour obtenir les requêtes brutes. Vous pouvez y ajouter d'autres requêtes, comme les procédures stockées, mais le filtre TSQL est la "base" que vous devez visualiser. Comme le Article de MSDN dit

"L'exécution d'une procédure stockée peut être surveillée par les fonctions SP:Starting, SP:StmtStarting, SP:StmtCompleted, et SP:Completed et toutes les classes d'événements classes d'événements TSQL".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X