Je suis dans une situation où je veux obtenir la valeur minimale de 6 colonnes.
J'ai trouvé jusqu'à présent trois façons d'accomplir cela, mais je suis préoccupé par les performances de ces méthodes et j'aimerais savoir laquelle serait la meilleure pour les performances.
La première méthode consiste à utiliser une grande déclaration de cas . Voici un exemple avec 3 colonnes, basé sur l'exemple du lien ci-dessus. Ma déclaration de cas serait beaucoup plus longue car je regarderai 6 colonnes.
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
La deuxième option consiste à utiliser l' UNION
opérateur avec plusieurs instructions de sélection . Je mettrais cela dans un UDF qui accepte un paramètre Id.
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
et
select min(col)
from
(
select col1 [col] from MyTable where Id = @id
union all
select col2 from MyTable where Id = @id
union all
select col3 from MyTable where Id = @id
) as t
Et la troisième option que j'ai trouvée était d' utiliser l'opérateur UNPIVOT , dont je ne savais même pas qu'il existait jusqu'à présent
with cte (ID, Col1, Col2, Col3)
as
(
select ID, Col1, Col2, Col3
from TestTable
)
select cte.ID, Col1, Col2, Col3, TheMin from cte
join
(
select
ID, min(Amount) as TheMin
from
cte
UNPIVOT (Amount for AmountCol in (Col1, Col2, Col3)) as unpvt
group by ID
) as minValues
on cte.ID = minValues.ID
En raison de la taille de la table et de la fréquence à laquelle cette table est interrogée et mise à jour, je suis préoccupé par l'impact sur les performances que ces requêtes auraient sur la base de données.
Cette requête sera en fait utilisée dans une jointure à une table avec quelques millions d'enregistrements, mais les enregistrements retournés seront réduits à une centaine d'enregistrements à la fois. Il sera exécuté plusieurs fois au cours de la journée et les 6 colonnes que j'interroge sont fréquemment mises à jour (elles contiennent des statistiques quotidiennes). Je ne pense pas qu'il y ait d'index sur les 6 colonnes que j'interroge.
Laquelle de ces méthodes est meilleure pour les performances lorsque vous essayez d'obtenir le minimum de plusieurs colonnes? Ou existe-t-il une autre meilleure méthode que je ne connais pas?
J'utilise SQL Server 2005
Exemples de données et de résultats
Si mes données contenaient des enregistrements comme celui-ci:
Id Col1 Col2 Col3 Col4 Col5 Col6 1 3 4 0 2 1 5 2 2 6 10 5 7 9 3 1 1 2 3 4 5 4 9 5 4 6 8 9
Le résultat final devrait être
Valeur ID dix 2 2 3 1 4 4
Year1
comme résultat, ce qui n'est pas nécessairement correct.