Jestem w sytuacji, w której chcę uzyskać minimalną wartość z 6 kolumn.
Znalazłem do tej pory trzy sposoby, aby to osiągnąć, ale mam obawy dotyczące wydajności tych metod i chciałbym wiedzieć, które z nich byłyby lepsze.
Pierwszą metodą jest użycie dużej instrukcji . Oto przykład z 3 kolumnami, na podstawie przykładu w powyższym linku. Mój opis przypadku byłby znacznie dłuższy, ponieważ będę patrzył na 6 kolumn.
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
Drugą opcją jest użycie UNION
operatora z wieloma instrukcjami select . Umieściłbym to w UDF, który akceptuje parametr Id.
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
i
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
A trzecią opcją, którą znalazłem, było użycie operatora UNPIVOT , który do tej pory nawet nie istniał
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
Ze względu na rozmiar i częstotliwość przeszukiwania i aktualizowania tej tabeli martwię się o wpływ wydajności tych zapytań na bazę danych.
To zapytanie zostanie faktycznie użyte w połączeniu z tabelą zawierającą kilka milionów rekordów, jednak zwracane rekordy będą zmniejszane do około stu rekordów jednocześnie. Będzie uruchamiany wiele razy w ciągu dnia, a 6 kolumn, o które pytam, są często aktualizowane (zawierają dzienne statystyki). Nie sądzę, że w 6 kolumnach, o które pytam, są jakieś indeksy.
Która z tych metod jest lepsza pod względem wydajności, gdy próbujesz uzyskać minimum wielu kolumn? A może istnieje inna lepsza metoda, o której nie wiem?
Używam SQL Server 2005
Przykładowe dane i wyniki
Jeśli moje dane zawierały takie rekordy:
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
Wynik końcowy powinien być
Wartość identyfikacyjna 1 0 2 2 3 1 4 4
Year1
wynik, co niekoniecznie musi być poprawne.