2014-07-18 6 views
4

나는 찾지 만 확실한 답을 찾지 못했습니다. 이들 중 어떤 SQL Server의 성능을 위해 더 나은 :두 개의 왼쪽 조인 대 유니온의 성능

SELECT T.* 
FROM dbo.Table1 T 
    LEFT JOIN Table2 T2 ON T.ID = T2.Table1ID 
    LEFT JOIN Table3 T3 ON T.ID = T3.Table1ID 
WHERE T2.Table1ID IS NOT NULL 
    OR T3.Table1ID IS NOT NULL 

또는 ...

SELECT T.* 
FROM dbo.Table1 T 
    JOIN Table2 T2 ON T.ID = T2.Table1ID 
UNION 
SELECT T.* 
FROM dbo.Table1 T 
    JOIN Table3 T3 ON T.ID = T3.Table1ID 

내가 모두 실행 시도하지만 확실히 말할 어렵다. 나는 왜 하나가 다른 것보다 빠르거나 상황에 의존하는지에 대한 설명에 감사 할 것입니다.

+2

실행 계획을 확인하십시오. –

+0

여기서 좋은 대답을 얻지 못하면 DBA 스택 교환에서 시도해보십시오. http://dba.stackexchange.com/ – valverij

+0

'실행 계획 '또는 정의 된 인덱스와 같은 다른 정보를 포함하십시오. –

답변

4

두 개의 쿼리가 동일한 작업을 수행하지 않습니다. 특히 값이 두 테이블 중 하나에 중복되는 경우 첫 번째 테이블은 중복 행을 반환합니다. Table2Table3 모두 Table1Id에 인덱스를 생성,

select t1.* 
from Table1 t1 
where exists (select 1 from Table2 t2 where t2.Table1Id = t1.id) or 
     exists (select 1 from Table3 t3 where t3.Table1Id = t1.id); 

을 그리고 : 당신이 다른 두 테이블 중 하나에 Table1 행을 찾고 있다면

, 나는 exists을 사용하는 것이 좋습니다 것입니다.

빠른 쿼리는 데이터에 많이 의존합니다. 두 번째 단계에서는 중복을 제거하기위한 추가 단계가 있습니다 (unionunion all). 반면에 첫 번째 행은 많은 중복 행을 만들 수 있습니다.

+0

명확한 설명에 감사드립니다! 원래 t2와 t3에서 몇 가지 값을 반환 할 것이 었습니다. 그래서 왼쪽의 'join'과 'union'사이에서 논쟁을 벌였습니다.하지만 나중에 필요하지 않은 것으로 판명되었고,'exist '. 또한 좋은 점, 중복에. 나는 질문을 올린 후 '뚜렷한'계획을 세웠지 만, 물론 성능이 나 빠졌다는 것을 알았습니다. 감사! – mayabelle

관련 문제