source

INER JOIN 상태에서 'OR'를 사용하는 것이 좋지 않은 생각입니까?

ittop 2023. 5. 7. 11:50
반응형

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

반응형