Ich bin in einer Situation, in der ich den Mindestwert von 6 Spalten erhalten möchte.
Bisher habe ich drei Möglichkeiten gefunden, um dies zu erreichen, aber ich habe Bedenken hinsichtlich der Leistung dieser Methoden und möchte wissen, welche für die Leistung besser wären.
Die erste Methode ist die Verwendung einer großen case-Anweisung . Hier ist ein Beispiel mit 3 Spalten, basierend auf dem Beispiel im obigen Link. Meine Fallbeschreibung wäre viel länger, da ich 6 Spalten betrachten werde.
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
Die zweite Möglichkeit besteht darin, den UNION
Operator mit mehreren select-Anweisungen zu verwenden . Ich würde dies in eine UDF setzen, die einen Id-Parameter akzeptiert.
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
und
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
Und die dritte Option, die ich gefunden habe, war die Verwendung des UNPIVOT-Operators , von dem ich bis jetzt noch gar nicht wusste, dass er existiert
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
Aufgrund der Tabellengröße und Häufigkeit, mit der diese Tabelle abgefragt und aktualisiert wird, bin ich besorgt über die Auswirkungen auf die Leistung, die diese Abfragen auf die Datenbank haben würden.
Diese Abfrage wird tatsächlich in einem Join zu einer Tabelle mit einigen Millionen Datensätzen verwendet. Die zurückgegebenen Datensätze werden jedoch auf jeweils rund hundert Datensätze reduziert. Es wird den ganzen Tag über mehrmals ausgeführt und die 6 von mir abgefragten Spalten werden regelmäßig aktualisiert (sie enthalten tägliche Statistiken). Ich denke nicht, dass es irgendwelche Indizes für die 6 Spalten gibt, die ich abfrage.
Welche dieser Methoden ist für die Leistung besser, wenn Sie versuchen, das Minimum mehrerer Spalten abzurufen? Oder gibt es eine andere bessere Methode, die ich nicht kenne?
Ich verwende SQL Server 2005
Probendaten & Ergebnisse
Wenn meine Daten Aufzeichnungen wie diese enthielten:
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
Das Endergebnis sollte sein
ID-Wert 1 0 2 2 3 1 4 4
Year1
als Ergebnis zurückgegeben, was möglicherweise nicht korrekt ist.