2016-09-08 2 views
1
SELECT h.* 
FROM h 
LEFT JOIN au ON au.ID = h.Key AND au.RaID = 40190 AND h.EntityType = 'Detail' 
LEFT JOIN ip ON ip.ID = h.Key AND ip.RaID = 40190 AND h.EntityType = 'itempart' 
WHERE 
coalesce(au.id,ip.id) is not null 

누구나이 방법을 최적화하는 것이 좋습니다. h는 거대한 히스토리 로그 테이블입니다.SQL Server에서 LEFT JOIN 최적화

+3

SQL Management Studio에서 쿼리 계획을 확인하십시오. 필요한 경우 색인을 제안합니다. – n8wrl

답변

2

그런 다음 내부 사용할 수있는 허용 된 유형의 조합을 사용하는 방법에 대한 가입 무엇 :

SELECT h.* 
FROM h 
    INNER JOIN (
       SELECT ID, 'Detail' AS EntityType FROM au WHERE (RaID = 40190) 
       UNION ALL 
       SELECT ID, 'itempart' AS EntityType FROM ip WHERE (RaID = 40190) 
      ) AS filt 
      ON h.Key = filt.ID 
      AND h.EntityType = filt.EntityType 

또한 당신이 열을 가입/필터링 된의 인덱스를 확인합니다. 항상 성능 문제를 찾을 때 n8wrl이 위에 제안한대로 쿼리 계획을 확인하십시오.

+0

클러스터 된 인덱스 또는 클러스터되지 않은 인덱스? 실행 계획에서 인덱스를 제안하는 곳은 어디입니까? 실제 실행 계획에서 92 %라는 특정 단계를 봤습니다. 그 위에 마우스를 가져 가면 무엇을 찾습니까? – DinaDee

+0

테이블에 클러스터형 인덱스는 하나만있을 수 있습니다. 실행 계획은 쿼리가 실행되는 방법에 대한 시각적 표현을 제공합니다. 가장 무거운 부품이 어디에 있는지 살펴 본 다음 해당 부품이 무엇을하는지 살펴봄으로써 최적화를 시작할 위치를 결정할 수 있습니다. 분명한 누락 된 색인이있는 경우 실행 계획의 맨 위에 제안 할 것입니다. 데이터베이스 엔진 튜닝 관리자 (SQL과 함께 제공되는 별도의 응용 프로그램)를 통해 쿼리를 실행 해 볼 수도 있습니다. – David

+0

다른 질문 1 :이 쿼리는 어떻게 왼쪽과 오른쪽 다르게 처리합니까? 이것은 왼쪽을 수용? – DinaDee