2013-06-28 2 views
0

다중 열 비교가있는 SQL Server 조인 성능 문제가 있습니다.SQL Server JOIN 성능

SELECT T1.* FROM T1, T2 
WHERE T1.LASTNAME = T2.LASTNAME AND 
T1.FIRSTNAME = T2.FIRSTNAME AND 
T1.MIDDLENAME = T2.MIDDLENAME AND 
DAY(T1.DoB) = T2.DOBDay AND 
MONTH(T1.DoB) = T2.DOBMonth 

각 테이블은 20,000 개가 넘으며 실제로 성능 문제가 발생합니다. 나는 그것을 달렸다. 그리고 내가 그것을 취소했을 정도로 6 분보다 오랫동안 잡았다!

해당 진술의 성능을 향상시킬 수있는 방법이 있습니까?

+0

두 테이블 모두에 어떤 인덱스가 있습니까? 실행 계획은 무엇이라고 말합니까? – peterm

+0

두 테이블의 where 절에있는 모든 필드의 인덱스를 확인하십시오! – Anshuman

+0

최악의 경우, 두 테이블 모두에 인덱스가 없으면 T1에있는 20,000 개의 행 각각은 T2에서 20,000 개의 행과 비교해야하며 결과적으로 400MM 행의 작업 세트가 생성됩니다. 이 문제가 앞에 오지 않고 화면 뒤에 있음을 확인하려면 사용 가능한 색인에 대한 설명을 제공하십시오. –

답변

0

당신은 지금

CREATE NONCLUSTERED INDEX IX_First_Middle_T2 ON T2 (FIRSTNAME,MIDDLENAME); 

실행 아래 쿼리 .. 전에 모두 당신의 테이블에 비 클러스터 인덱스 아래를 만들어야합니다

SELECT T1.*,DAY(T1.DOB) as DOBDay, MONTH(T1.DOB) as DOBMonth INTO #T1 
CREATE NONCLUSTERED INDEX IX_First_Middle_T1 ON #T1 (FIRSTNAME,MIDDLENAME); 

SELECT T1.* 
FROM #T1 T1 
JOIN T2 
ON T1.LASTNAME  = T2.LASTNAME 
and T1.FIRSTNAME = T2.FIRSTNAME 
and T1.MIDDLENAME = T2.MIDDLENAME 
and T1.DOBDay  = T2.DOBDay 
and T1.DOBMonth = T2.DOBMonth 

위의 쿼리는 당신에게 추가로 두 가지를 제공합니다 T1 대신 * 및 날짜가있는 열. * 열 이름으로 바꿉니다.

2

T1 테이블의 데이터 만 필요하기 때문에 왼쪽 결합 또는 존재 절을 사용할 수 있습니다.

select T1.* 
    from T1 
    where 
     exists (
        select 1 
        from T2 
        where 
        T1.LASTNAME = T2.LASTNAME 
        and T1.FIRSTNAME = T2.FIRSTNAME 
        and T1.MIDDLENAME = T2.MIDDLENAME 
        and DAY(T1.DoB) = T2.DOBDay 
        and MONTH(T1.DoB) = T2.DOBMonth 
      ) 
+0

안녕하세요. 나는 이걸 시험해 보았는데 성능이 더 나빠진 것처럼 보였습니다. 실행 시간을 두 배로 늘림 – James