6 열 중 최소값을 얻으려는 상황에 있습니다.
지금 까지이 작업을 수행하는 세 가지 방법을 찾았지만 이러한 방법의 성능에 관심이 있으며 성능에 더 적합한 방법을 알고 싶습니다.
첫 번째 방법은 큰 사례 를 사용 하는 것 입니다. 위 링크의 예를 기반으로 3 개의 열이있는 예가 있습니다. 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
여러 select 문과 함께 연산자 를 사용하는 것 입니다. Id 매개 변수를 허용하는 UDF에 이것을 넣을 것입니다.
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
그리고 내가 찾은 세번째 옵션은했다 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
테이블 크기와이 테이블을 쿼리하고 업데이트하는 빈도 때문에 이러한 쿼리가 데이터베이스에 미치는 영향에 대해 걱정하고 있습니다.
이 쿼리는 실제로 몇 백만 개의 레코드가있는 테이블에 대한 조인에 사용되지만 반환 된 레코드는 한 번에 약 100 개의 레코드로 줄어 듭니다. 하루 종일 여러 번 실행되며 쿼리하는 6 개의 열이 자주 업데이트됩니다 (일일 통계 포함). 쿼리하는 6 열에 인덱스가 없다고 생각합니다.
최소한 여러 열을 얻으려고 할 때 성능에 더 좋은 방법은 무엇입니까? 아니면 내가 모르는 다른 더 좋은 방법이 있습니까?
SQL Server 2005를 사용하고 있습니다
샘플 데이터 및 결과
내 데이터에 다음과 같은 레코드가 포함 된 경우 :
Id Col1 Col2 Col3 Col4 Col5 Col6 12 34 5 2 2 6 10 5 7 9 3 1 2 3 4 5 4 9 5 4 6 8 9
최종 결과는
ID 가치 1 0 2 2 3 1 4 4
Year1
결과로 반환 되므로 반드시 정확하지는 않습니다.