복붙노트

[SQL] 내부의 'OR'는 조건이 나쁜 생각 JOIN 데?

SQL

내부의 'OR'는 조건이 나쁜 생각 JOIN 데?

대단히 느린 쿼리의 속도로, 내가 조인에 또는 나의 내부에 문제가 좁혀 (각각,이 중요한 경우 SQL 서버 2008 만 ~ 5 만 개 행이 개 테이블에 몇 분)을 개선하기 위해 노력에서 :

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

나는 (I가 무슨 희망) 왼쪽의 동등한 쌍, 여기에 표시 조인이 변경 :

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. ==============================

    1.가입 이런 종류의 해시 조인을 최적화 할 수 없거나 병합이 가입.

    가입 이런 종류의 해시 조인을 최적화 할 수 없거나 병합이 가입.

    이것은 두 가지 결과 집합의 연결로 표현 될 수있다 :

    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 서버의 최적화는 당신이 쓴 쿼리에서 볼 수있는 스마트 충분이 아닌 (그들은 논리적으로 동일하지만).

  2. ==============================

    2.상태에서 다른 결과를 얻기 위해 나는 코드를 다음을 사용 그건 나를 위해 일했다.

    상태에서 다른 결과를 얻기 위해 나는 코드를 다음을 사용 그건 나를 위해 일했다.

    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)
    
  3. ==============================

    3.대신 UNION ALL을 사용할 수 있습니다.

    대신 UNION ALL을 사용할 수 있습니다.

    SELECT mt.ID, mt.ParentID, ot.MasterID  dbo.MainTable AS 금강산 FROM  연합 ALL  SELECT mt.ID, mt.ParentID, ot.MasterID  dbo.OtherTable AS의 구약

  4. from https://stackoverflow.com/questions/5901791/is-having-an-or-in-an-inner-join-condition-a-bad-idea by cc-by-sa and MIT license