Saya berada dalam situasi di mana saya ingin mendapatkan nilai minimum dari 6 kolom.
Sejauh ini saya telah menemukan tiga cara untuk mencapai hal ini, tetapi saya memiliki keprihatinan dengan kinerja metode ini dan ingin tahu mana yang lebih baik untuk kinerja.
Metode pertama adalah dengan menggunakan pernyataan kasus besar . Berikut adalah contoh dengan 3 kolom, berdasarkan contoh di tautan di atas. Pernyataan kasus saya akan jauh lebih lama karena saya akan melihat 6 kolom.
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
Opsi kedua adalah menggunakan UNION
operator dengan beberapa pernyataan pilih . Saya akan menempatkan ini di UDF yang menerima parameter ID.
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
dan
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
Dan opsi ke-3 yang saya temukan adalah menggunakan operator UNPIVOT , yang saya bahkan tidak tahu ada sampai sekarang
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
Karena ukuran tabel, dan frekuensi di mana tabel ini ditanyai dan diperbarui, saya khawatir tentang dampak kinerja kueri ini pada database.
Permintaan ini sebenarnya akan digunakan dalam gabungan ke tabel dengan beberapa juta catatan, namun catatan yang dikembalikan akan dikurangi menjadi sekitar seratus catatan sekaligus. Itu akan dijalankan berkali-kali sepanjang hari, dan 6 kolom yang saya tanyakan sering diperbarui (mengandung statistik harian). Saya tidak berpikir ada indeks pada 6 kolom yang saya tanyakan.
Manakah dari metode ini yang lebih baik untuk kinerja ketika mencoba untuk mendapatkan minimum beberapa kolom? Atau adakah metode lain yang lebih baik yang tidak saya ketahui?
Saya menggunakan SQL Server 2005
Sampel Data & Hasil
Jika data saya berisi catatan seperti ini:
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
Hasil akhirnya seharusnya
Nilai Id 1 0 2 2 3 1 4 4
Year1
sebagai hasilnya, yang mungkin belum tentu benar.