Comment obtenir les indicateurs de performances d’une requête SQL avec SQL Server ?
Lorsque l’on réalise une application qui utilise un serveur de base de donnée, il est toujours intéressant de regarder quelles sont les performances des requêtes SQL que notre application exécute.
Il y a plusieurs solutions pour arriver à ces fins.
La première, la plus connue, est d’utiliser SQL Server Profiler. Il s’agit d’un outil qui va analyser tout ce qui transite sur le serveur SQL.
Lorsque vous lancez l’outil, il va d’abord vous demander de vous connecter sur un serveur SQL, puis, il va vous demander un template. Un template est un ensemble de règle qui permet de tracer seulement certains événements. Je trouve que le template par défaut log trop de choses et qu’il manque certaines données importantes.
Pour ma part, je ne logge que ces informations :

J’ai rajouté la colonne “RowCounts” qui permet de savoir le nombre de ligne retourné par la requête, et supprimé les événements “RPC:Starting” et “SQL:BatchStarting” qui surgisse dès le début de la requête, avant même que SQL ait commencé l’analyse.
Ensuite, après avoir configuré la trace, vous allez voir apparaitre les différentes requêtes qui sont jouées sur votre serveur.

Les colonnes intéressantes sont les colonnes :
- CPU : nombre d’unité de CPU consommé (unité arbitraire)
- Reads : nombre de pages lues
- Writes : nombre de pages écrites
- Duration : durée d’éxécution en ms
- RowCounts : nombre de ligne retourné par la requête
Il est également possible de mettre des flags au niveau de votre session SQL Server, ainsi pour chaque batch de votre session, vous aurez le détail des accès disques et durée d’exécution. Les flags à spécifier sont les flags suivants :
set statistics io on
set statistics time on
select *
from magelia.Address
where Name = 'home'
Au niveau des messages vous obtiendrez alors :
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
(8142 row(s) affected)
Table 'Address'. Scan count 1, logical reads 2775, physical reads 0, read-ahead reads 0, lob logical reads 5496, lob physical reads 0, lob read-ahead reads 5242.
SQL Server Execution Times:
CPU time = 78 ms, elapsed time = 778 ms.
SQL Server Execution Times:
CPU time = 78 ms, elapsed time = 778 ms.
Ne vous focalisez pas sur le temps d’exécution ! Lorsque vous êtes tous seul sur votre base de données, le disque dur est peu sollicité, les durées d’exécution seront globalement bonnes. Par contre, focalisez-vous sur le nombre de pages lues : ce qui est couteux sur un serveur SQL est les accès disques. Il est donc préférable d’avoir une requête qui consomme très peu de pages lues plutôt qu’une requête un peu plus rapide qui consomme beaucoup plus de pages lues.
Et vous qu’utilisez-vous pour connaitre les performances des requêtes SQL que vous écrivez ?