는 꽤 정기적으로 ON
조항에 ISNULL
및 COALESCE
를 사용하지만 인덱스가 사용되지 하듯이 최적화 문제를 일으킬 수 있다는 것을 읽었습니다.부울 등가
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)
+1 x.Client 또는 x.Prod가 null 인 행 (왼쪽 조인에서 허용)을 허용하지 않는다는 점을 제외하면 왼쪽 조인과 같습니다. 또한 하나의 값은 일치 할 수 있지만 다른 하나는 일치하지 않습니다 –
... +1 감사합니다. 유형 문제를 더 잘 처리하는 것으로 보아 COALESCE가 기본 설정입니다. – whytheq
... 내가 최근에 읽은 내용에 대한 더 나은 설명으로 OP를 편집했습니다.이 'ON'등급의 변환을 묻습니다. – whytheq