반응형
INER JOIN 상태에서 'OR'를 사용하는 것이 좋지 않은 생각입니까?
매우 느린 쿼리의 속도를 개선하기 위해(각각 최대 50,000개의 행만 있는 두 개의 테이블에서 몇 분 동안, SQL Server 2008에서) 문제를 다음과 같이 좁혔습니다.OR
내 내면의 결합에서, 예를 들면:
SELECT mt.ID, mt.ParentID, ot.MasterID
FROM dbo.MainTable AS mt
INNER JOIN dbo.OtherTable AS ot ON ot.ParentID = mt.ID
OR ot.ID = mt.ParentID
나는 이것을 (내가 바라는 것은) 동등한 왼쪽 조인 쌍으로 변경했고, 여기에 표시됩니다.
SELECT mt.ID, mt.ParentID,
CASE WHEN ot1.MasterID IS NOT NULL THEN
ot1.MasterID ELSE
ot2.MasterID END AS MasterID
FROM dbo.MainTable AS mt
LEFT JOIN dbo.OtherTable AS ot1 ON ot1.ParentID = mt.ID
LEFT JOIN dbo.OtherTable AS ot2 ON ot2.ID = mt.ParentID
WHERE ot1.MasterID IS NOT NULL OR ot2.MasterID IS NOT NULL
이제 쿼리가 약 1초 후에 실행됩니다!
일반적으로 그것을 넣는 것은 나쁜 생각입니까?OR
결합 상태에서?아니면 제가 테이블 배치에서 운이 없는 것일까요?
이런 종류의JOIN
최적화할 수 없습니다.HASH JOIN
또는MERGE JOIN
.
두 결과 집합의 연결로 표현할 수 있습니다.
SELECT *
FROM maintable m
JOIN othertable o
ON o.parentId = m.id
UNION
SELECT *
FROM maintable m
JOIN othertable o
ON o.id = m.parentId
그들 각각은 에퀴조인이지만,SQL Server
의 최적화 도구는 사용자가 작성한 쿼리에서 볼 수 있을 정도로 똑똑하지 않습니다(논리적으로 동일하지만).
나는 나에게 효과가 있었던 조건과 다른 결과를 얻기 위해 다음 코드를 사용합니다.
Select A.column, B.column
FROM TABLE1 A
INNER JOIN
TABLE2 B
ON A.Id = (case when (your condition) then b.Id else (something) END)
대신 UNION ALL을 사용할 수 있습니다.
SELECT mt.ID, mt.ParentID, ot.MasterID
FROM dbo.MainTable AS mt
UNION ALL
SELECT mt.ID, mt.ParentID, ot.MasterID
FROM dbo.OtherTable AS ot
언급URL : https://stackoverflow.com/questions/5901791/is-having-an-or-in-an-inner-join-condition-a-bad-idea
반응형
'source' 카테고리의 다른 글
시스템, 보안보안.이벤트 로그에 쓸 때 예외 발생 (0) | 2023.05.07 |
---|---|
Xcode 오류: "앱 ID를 개발팀에 등록할 수 없습니다." (0) | 2023.05.07 |
팬더는 Excel(.xlsx) 파일을 열 수 없습니다. (0) | 2023.05.07 |
프로그래밍 방식으로 Swift의 이전 View 컨트롤러로 돌아가기 (0) | 2023.05.07 |
pg_dump를 제대로 인증하려면 어떻게 해야 합니까? (0) | 2023.05.07 |