6 sütundan minimum değeri almak istediğim bir durumdayım.
Bunu başarmak için şu ana kadar üç yol buldum, ancak bu yöntemlerin performansıyla ilgili endişelerim var ve hangisinin performans için daha iyi olacağını bilmek istiyorum.
İlk yöntem büyük bir durum ifadesi kullanmaktır . İşte yukarıdaki bağlantıdaki örneğe göre 3 sütunlu bir örnek. Benim durumum çok daha uzun olacaktı çünkü 6 sütuna bakacağım.
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
İkinci seçenek, UNION
operatörü çoklu seçim ifadeleriyle kullanmaktır . Bunu bir Id parametresini kabul eden bir UDF'ye koyardım.
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
ve
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
Ve bulduğum üçüncü seçenek , şimdiye kadar bile var olduğumu bilmediğim UNPIVOT operatörünü kullanmaktı.
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
Tablo boyutu ve bu tablonun sorgulanma ve güncellenme sıklığı nedeniyle, bu sorguların veritabanı üzerindeki etkisi hakkında endişeliyim.
Bu sorgu aslında birkaç milyon kaydın bulunduğu bir masaya katılmak için kullanılacak, ancak geri gönderilen kayıtlar bir seferde yaklaşık yüz kayda indirilecek. Gün boyunca birçok kez çalıştırılır ve sorguladığım 6 sütun sıklıkla güncellenir (günlük istatistikler içerir). Sorguladığım 6 sütunda herhangi bir dizin olduğunu sanmıyorum.
Minimum olarak birden çok sütun almaya çalışırken bu yöntemlerden hangisi performans için daha iyidir? Yoksa bilmediğim daha iyi bir yöntem var mı?
SQL Server 2005 kullanıyorum
Örnek Veri ve Sonuçlar
Verilerim böyle kayıtlar içeriyorsa:
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
Nihai sonuç olmalı
Kimlik Değeri 1 0 2 2 3 1 4 4
Year1
mutlaka doğru olmayabilir, sonuç olarak geri döner .