ฉันอยู่ในสถานการณ์ที่ฉันต้องการรับค่าต่ำสุดจาก 6 คอลัมน์
ฉันได้พบสามวิธีในการบรรลุเป้าหมายนี้ แต่ฉันมีความกังวลเกี่ยวกับประสิทธิภาพของวิธีการเหล่านี้และต้องการทราบว่าวิธีไหนที่จะดีกว่าสำหรับการแสดง
วิธีแรกคือการใช้คำสั่งคดีใหญ่ นี่คือตัวอย่างที่มี 3 คอลัมน์ตามตัวอย่างในลิงก์ด้านบน คำสั่ง case ของฉันจะนานกว่านี้เพราะฉันจะดูที่ 6 คอลัมน์
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
ตัวเลือกที่สองคือการใช้ประกอบกับงบเลือกหลายUNION
ฉันจะใส่สิ่งนี้ใน UDF ที่ยอมรับพารามิเตอร์ Id
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
และ
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
และตัวเลือกที่ 3 ที่ฉันพบคือใช้ตัวดำเนินการ UNPIVOTซึ่งฉันไม่รู้ด้วยซ้ำจนกระทั่งตอนนี้
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
เนื่องจากขนาดของตารางและความถี่ที่มีการสอบถามและอัปเดตตารางนี้ฉันจึงกังวลเกี่ยวกับผลกระทบของประสิทธิภาพการทำงานที่แบบสอบถามเหล่านี้จะมีในฐานข้อมูล
จริง ๆ แล้วแบบสอบถามนี้จะถูกใช้ในการเข้าร่วมกับตารางที่มีระเบียนไม่กี่ล้านระเบียนอย่างไรก็ตามระเบียนที่ส่งคืนจะถูกลดลงเป็นร้อยระเบียนในแต่ละครั้ง มันจะทำงานหลายครั้งตลอดทั้งวันและ 6 คอลัมน์ที่ฉันสืบค้นมีการอัปเดตบ่อยครั้ง (มีสถิติรายวัน) ฉันไม่คิดว่าจะมีดัชนีใด ๆ ในคอลัมน์ 6 คอลัมน์ที่ฉันกำลังสืบค้น
วิธีใดในวิธีเหล่านี้จะดีกว่าสำหรับประสิทธิภาพเมื่อพยายามรับขั้นต่ำของหลายคอลัมน์ หรือมีวิธีอื่นที่ดีกว่าที่ฉันไม่รู้
ฉันใช้ SQL Server 2005
ข้อมูลตัวอย่างและผลลัพธ์
หากข้อมูลของฉันมีบันทึกเช่นนี้:
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 9
ผลลัพธ์ที่ได้ควรจะเป็น
รหัสประจำตัว 1 0 2 2 3 1 4 4
Year1
เป็นผลลัพธ์ซึ่งอาจไม่ถูกต้อง