J'essaie de déterminer les performances relatives de deux requêtes différentes et je dispose de deux méthodes de mesure :
1. Exécutez les deux et chronométrez chaque requête
2. Exécutez les deux et obtenez le "coût de la requête" à partir du plan d'exécution réel.
Voici le code que j'exécute pour chronométrer les requêtes...
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1a
SELECT getDate() - @start AS Execution_Time
GO
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1b
SELECT getDate() - @start AS Execution_Time
GO
Ce que j'obtiens est le suivant :
Stored_Proc Execution_Time Query Cost (Relative To Batch)
test_1a 1.673 seconds 17%
test_1b 1.033 seconds 83%
Les résultats du temps d'exécution contredisent directement les résultats du coût de la requête, mais j'ai du mal à déterminer ce que signifie réellement "coût de la requête". Je pense que c'est un agrégat de Reads/Writes/CPU_Time/etc, donc j'ai quelques questions :
-
Existe-t-il une source définitive pour expliquer ce que signifie cette mesure ?
-
Quelles autres mesures de "performance des requêtes" les gens utilisent-ils, et quels sont leurs mérites relatifs ?
Il est important de noter qu'il s'agit d'un serveur SQL de taille moyenne, exécutant MS SQL Server 2005 sur MS Server 2003 Enterprise Edition avec plusieurs processeurs et plus de 100 utilisateurs simultanés.
EDITAR:
Après quelques soucis, j'ai réussi à obtenir un accès à Profiler sur ce serveur SQL, et je peux donner des informations supplémentaires (ce qui confirme que le coût de la requête est lié aux ressources du système, et non au temps d'exécution lui-même...).
Stored_Proc CPU Reads Writes Duration
test_1a 1313 3975 93 1386
test_1b 2297 49839 93 1207
Il est impressionnant de constater que prendre plus de CPU avec BEAUCOUP plus de lectures prend moins de temps :)