SQL: Considérations de vitesse: multiplication par 0/1 par action conditionnelle

Y aurait-il une différence de vitesse significative entre les requêtes suivantes?

- SELECT value * coeff from Table - SELECT CASE WHEN coeff = 0 THEN 0 ELSE value END FROM Table 

Je sais que je pourrais juste essayer et voir, mais je suis sûr que vous aurez des commentaires intéressants à faire sur la façon dont les différents moteurs de DB traiteraient cela, et des choses que les quelques tests que je ferais manqueraient.

Il n'y aurait pas de différences de vitesse significatives.

Au niveau le plus bas, vous devez charger les deux valeurs dans les registres de la CPU. Ensuite, la différence est à peu près …

 Load coeff into register1 Load value into register2 If register1 is not 0, skip the next operation Load 0 into register2 Return value in register2 

contre

 Load coeff into register1 Load value into register2 register2 = register1 * register2 Return value in register2 

La seconde est toujours 4 opérations. Le premier est 5 opérations quand coef est non nul.

Mais la première version a des opérations très simples. La multiplication dans la seconde sera plus intensive. Pour autant que je sache, la multiplication entière de 0 ou 1 est toujours aussi rapide que vous obtenez. Si VALUE est un Float, cependant, il sera plus intensif.

(Tout cela provient d'une connaissance de base, pas d'expertise.)

Tout cela dit, cependant, la différence sera beaucoup less que le chargement de données à partir du disque, ou la transmission sur TCP / IP.

Vous devez exécuter un profileur et mesurer les cycles de processeur utilisés par chacun. Pas le time pris. Vous pouvez find que vous utilisez très légèrement less de CPU avec une version sur l'autre. Et pourtant, voir presque aucune différence dans le time total pris.

Il peut y avoir une différence dans les types de données résultants entre les colonnes multiplication et case.

Essaye ça

 CREATE TABLE #Tmp (value DECIMAL(19, 2), coeff BIT) INSERT #Tmp SELECT 15, 1 INSERT #Tmp SELECT 16, 0 SELECT value * coeff AS final_value_mult , CASE WHEN coeff = 0 THEN 0 ELSE value END AS final_value_case INTO aaa FROM #Tmp --DROP TABLE aaa, #Tmp 

Ensuite, la table de script aaa dans SSMS

 CREATE TABLE [dbo].[aaa]( [final_value_mult] [decimal](38, 4) NULL, [final_value_case] [decimal](19, 2) NULL ) ON [PRIMARY] 

Évidemment, la multiplication a augmenté la précision / l'échelle du type de données de value . CASE est beaucoup plus immunisé contre de tels résultats inattendus.