2017-10-17 2 views
1

우리는 (일부 내부 이유) 생산에 느린 쿼리,변환 OUTER JOIN은 왼쪽에 적용

SELECT T2.Date 
FROM Table1 T1 
OUTER APPLY 
(
    SELECT TOP 1 T2.[DATE] 
    FROM Table2 T2 
    WHERE T1.Col1 = T2.Col1 
    AND T1.Col2 = T2.Col2 
    ORDER BY T2.[Date] DESC 
) T2 

을하지만 왼쪽으로 변환 할 때, 그것은 신속하게

SELECT Max(T2.[Date]) 
FROM Table1 T1 
LEFT JOIN Table2 T2 
    ON T1.Col1 = T2.Col1 
    AND T1.Col2 = T2.Col2 
GROUP BY T1.Col1, T1.Col2 

할 수있는 가입 우리는 두 쿼리가 동등하다고 말합니까? 그렇지 않다면 제대로 변환하는 방법.

+0

첫 번째 쿼리가 유효한 구문이 아니기 때문에 둘 다 동일하지 않습니다.하지만 어쩌면 난독 화 시도에서 오류가 발생했을 수 있습니다. 별명 A는 정의되지 않았으므로 A.DATE를 참조하십시오. – SMor

+0

@SMor 예 지금 수정했습니다. 동등한가요? – user960567

+0

또한 제안 된 논리는 일부 가정에 의존하는 것처럼 보입니다. 집합체를 사용하면 논리가 유사한 것으로 가정하여 반환되는 행 수를 줄여야합니다. 사용할 수있는 데이터에 근거하여 행운이라고 생각합니까? 이것을 시도하고 결과를 비교 했습니까? – SMor

답변

1

쿼리가 정확히 일치하지 않습니다. 차이를 이해하는 것이 중요합니다.

t1.col1/t1.col2이 중복되는 경우 첫 번째 쿼리는 각 중복에 대해 별도의 행을 반환합니다. 두 번째 행은 이들을 하나의 행으로 결합합니다.

t1.col1 또는 t1.col2NULL 인 경우 첫 번째 쿼리는 최대 날짜로 NULL을 반환합니다. 두 번째 행과 적절한 최대를 반환합니다.

두 쿼리의 성능은 비슷해야합니다. 특히 색인이 table2(col1, col2, date) 인 경우 특히 그렇습니다. 어떤 상황에서는 apply 메서드가 join보다 빠르기 때문에 상대적인 성능은 경우에 따라 다릅니다.

+0

. 내 경우에는 T1.Col1, T1.Col2가 고유하고 nullable이 아님을 확신합니다. :) – user960567

관련 문제