2010-04-22 2 views
0

두 개의 테이블이 있습니다. 하나는 약 1500 개의 레코드가 있고 다른 하나에는 약 300000 개의 하위 레코드가 있습니다. 약 1 : 200 비율. 부모 테이블을 스테이징 테이블 인 SomeParentTable_Staging으로 스테이지 한 다음 모든 자식 레코드를 스테이징합니다. 그러나 부모 테이블에 준비된 레코드와 관련된 스테이션 만 원합니다. 그래서 아래의 쿼리를 사용하여 부모 테이블의 스테이지 데이터에 가입하여이 스테이징을 수행합니다.동일한 쿼리에는 INSERT와 함께 사용할 때 중첩 루프가 있지만

--Stage child records 
INSERT INTO [dbo].[SomeChildTable_Staging] 
      ([SomeChildTableId] 
      ,[SomeParentTableId] 
      ,SomeData1 
      ,SomeData2 
      ,SomeData3 
      ,SomeData4  
     ) 
    SELECT [SomeChildTableId] 
     ,D.[SomeParentTableId] 
      ,SomeData1 
      ,SomeData2 
      ,SomeData3 
      ,SomeData4  
    FROM [dbo].[SomeChildTable] D 
INNER JOIN dbo.SomeParentTable_Staging I ON D.SomeParentTableID = I.SomeParentTableID; 

실행 계획은 테이블이 중첩 루프로 조인되고 있음을 나타냅니다. 삽입없이 쿼리의 선택 부분 만 실행하면 해시 일치로 조인이 수행됩니다. 따라서 select 문은 동일하지만 삽입 컨텍스트에서 느린 중첩 루프를 사용합니다. 조인 양쪽에 인덱스가 있도록 D.SomeParentTableID에 클러스터되지 않은 인덱스를 추가했습니다. I.SomeParentTableID는 클러스터 된 인덱스가있는 기본 키입니다.

왜 조인을 사용하는 삽입에 중첩 루프를 사용합니까? 삽입에 대한 조인의 성능을 향상시킬 수있는 방법이 있습니까?

+0

SELECT ... INTO에 대한 실행 계획을 보았습니까? – ig0774

답변

2

몇 가지 생각 :

  1. 이 통계를 최신 상태로 있는지 확인합니다. 잘못된 통계는 기괴한 "간헐적 인"쿼리 계획 문제를 해결합니다.

  2. 인 것을 확인하십시오. 그렇지 않으면 옵티마이 저가 무시할 가능성이 훨씬 높습니다.

  3. 아무 것도 도움이되지 않는다면, INNER JOIN이 아닌 INNER HASH JOIN을 작성하여 특정 참여를 강제로 수행 할 수 있습니다.

+0

+1 아이디어는 3 번째 생각 (처음 2 개는 나에게 많은 의미를 갖지 못한다.) – Andomar

+0

@Andomar : 가끔은 파스 트리에서 약간의 차이가있다. (그리고 INSERT는 끝 부분에 붙어있다.) 최적화 프로그램이 임계 값을 초과한다고 생각하면 완전히 다른 계획이 발생할 수 있습니다. 어쨌든, 나는 그 중 하나가 작동하지만 100 % 확신 할 수는 없지만 시도해볼 가치가 없습니다! – Aaronaught

+0

바로. 3 가지 옵션 중에서 명시적인'해쉬 조인 (hash join) '은 영구적 인 수정입니다 : – Andomar

1

대상 테이블에 클러스터 된 인덱스가 있습니까? 삽입에서 데이터의 순서를 쉽게하기 위해 조인을 선택해야 할 수 있습니다. 대상 테이블에 클러스터 된 인덱스가 있는지 여부와 실행중인 열의 유형에 따라 실행 계획이 달라졌습니다.

+0

예. 해시 조인을 '해시 조인'으로 강제 실행하면 클러스터 된 인덱스 삽입을 수행하기 위해 쿼리에 두 개의 추가 단계가 추가되기 때문에 이는 의미가 있습니다. – AaronLS

+0

@AaronLS - 예, 정확히 내가 본 사례입니다. 따라서 명시 적 해시 조인을 사용하는 삽입은 해시 조인을 강제 할 때 클러스터 된 인덱스를 수용하는 데 필요한 추가 단계가 없으면 삽입없이 수행하는 것보다 빠르게 수행됩니까? –

+0

'hash join '은 약 18 초에 약간 더 빠르며 20 초가 없으면 약간 더 빠릅니다. 따라서 현 시점에서는 중요하지 않습니다. 나중에 클러스터되지 않은 기본 키를 사용하여 테스트하고 전체 준비 프로세스를 실행하고 변경으로 인해 영향을받는 다른 쿼리가 있기 때문에 전반적인 속도 증가가 감소보다 중요한지 확인하십시오. – AaronLS

관련 문제