En faisant du refactoring de code Sql il m’arrive de tomber sur des choses comme ça:

DECLARE @var1 int
DECLARE @var2 int
 
SET @var1 = (select count(*) from MaTable where LEN(Name) = 0)
SET @var2= (select count(*) from MaTable where DateDiff(d,GetDate(),Updated) < 1 )
 
SELECT @var1, @var2

 

Dans l'absolu ce n'est pas choquant car ce n'est pas le genre de code qui plombe les perfs, néanmoins deux choses me gênent:

  • pourquoi faire un set variable = (sous requete) alors que l'on a a directement la même chose avec select variable
  • pourquoi faire deux requetes alors que une suffit?

 

Voici par exemple ce que l'on pourrait écrire pour aboutir au même résultat:

 

DECLARE @var1 INT, @var2 INT
SELECT    @var1 = SUM(CASE WHEN LEN(Name) = 0 THEN 1 ELSE 0 END),
        @var2 = SUM(CASE WHEN DateDiff(d,GetDate(),Updated) < 1 THEN 1 ELSE 0 END)
FROM    MaTable
 
SELECT @var1, @var2

Tout cela dépend bien sur des calculs effectués mais quoi qu'il en soit on ne fait qu'une lecture des pages

mémoire au lieu de deux. Si les calculs sont compliqués, les calculs d'aggrégation peuvent prendre un peu plus de

CPU certes, mais quoi qu'il en soit le temps total sera nettement inférieur.