2013-08-16 2 views
1

는 꽤 정기적으로 ON 조항에 ISNULLCOALESCE를 사용하지만 인덱스가 사용되지 하듯이 최적화 문제를 일으킬 수 있다는 것을 읽었습니다.부울 등가

FROM dbo.tb_xxx x 
     INNER JOIN dbo.tb_yyy y ON   
     x.Client = COALESCE(y.Client, x.Client) AND 
     x.Prod = COALESCE(y.Prod, x.Prod) 

... 난이 이에 상응하는 다음과 같은 ...

FROM dbo.tb_xxx x 
     INNER JOIN dbo.tb_yyy y ON  
     x.Client = y.Client AND 
     x.Prod  = y.Prod 
     OR y.Client IS NULL 
     OR y.Prod IS NULL 

로 변환했습니다

나는 현재 다음이?
그렇지 않다면 왜 안 되니?


편집
나는 그것이 성능에 영향을 미칠 수 있음을 100 % 아니에요 그러나 최근에 나는 말했다 Itzik 벤 된 웨이 코 뮤니하여 텍스트를 읽을 것과 같은 성능에 영향을 미칠 수있는 데이터의 집합을 조인 할 때 COALESCE(T1.col1,-1) = COALESCE(T2.col1,-1) 같은 조건을 사용하여 col1을 조작하면 데이터가 다시 작성되고 col1의 기존 색인이 사용되지 않습니다. 이것은 "sargability"의 개념입니다.

오히려이 경기 술어
COALESCE(T1.col1,-1) = COALESCE(T2.col1,-1)
를 사용하는 것보다 그는 아니, 그렇지 않은이
T1.col1 = T2.col1 OR (T1.col1 IS NULL AND T2.col1 IS NULL)

답변

4

제안합니다. 당신이 쓴 무엇

당신은

(x.Client = y.Client OR y.Client IS NULL) 
AND 
(x.Prod  = y.Prod OR y.Prod IS NULL) 

필요

(x.Client = y.Client AND x.Prod  = y.Prod) 
    OR (y.Client IS NULL) 
    OR (y.Prod IS NULL) 

에 해당 그리고 그게 원래보다 더 좋을 거라 확실하지 않다.

성능 측면에서 SQL 서버의 경우 COALESCE보다 자주 수행됩니다 (단, COALESCE). 중요하다면 후자는 ANSI 호환입니다.

그래서 나에게는 왼쪽 가입을 시도하고있는 것 같습니다.

FROM dbo.tb_xxx x 
LEFT JOIN dbo.tb_yyy y ON  
    x.Client = y.Client AND 
    x.Prod  = y.Prod 
+0

+1 x.Client 또는 x.Prod가 null 인 행 (왼쪽 조인에서 허용)을 허용하지 않는다는 점을 제외하면 왼쪽 조인과 같습니다. 또한 하나의 값은 일치 할 수 있지만 다른 하나는 일치하지 않습니다 –

+0

... +1 감사합니다. 유형 문제를 더 잘 처리하는 것으로 보아 COALESCE가 기본 설정입니다. – whytheq

+0

... 내가 최근에 읽은 내용에 대한 더 나은 설명으로 OP를 편집했습니다.이 'ON'등급의 변환을 묻습니다. – whytheq