>데이터 베이스 >MySQL 튜토리얼 >INNER JOIN의 OR 조건이 성능 저하를 일으키는 이유는 무엇입니까?

INNER JOIN의 OR 조건이 성능 저하를 일으키는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-10 18:47:431020검색

Why Does an OR Condition in an INNER JOIN Cause a Performance Penalty?

데이터베이스 최적화: INNER JOIN에서 OR 조건이 성능에 미치는 영향

데이터베이스 쿼리 최적화에서는 JOIN 문의 다양한 조건이 미치는 영향을 이해하는 것이 중요합니다. 일반적인 문제 중 하나는 INNER JOIN에서 OR 조건을 사용하는 것입니다.

다음 쿼리를 고려해 보세요.

<code class="language-sql">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</code>

이 쿼리는 처음 실행하는 데 몇 분 정도 걸립니다. 자세히 조사한 결과 INNER JOIN의 OR 조건에 문제가 있는 것으로 확인되었습니다.

이 문제를 해결하기 위해 LEFT JOIN 쌍을 사용하도록 쿼리를 다시 작성했습니다.

<code class="language-sql">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</code>

이제 최적화된 쿼리는 약 1초 안에 실행이 완료됩니다.

INNER JOIN에서 OR 조건을 사용하면 다음과 같은 이유로 쿼리 성능에 심각한 영향을 미칩니다.

  • 이것은 최적화 프로그램이 HASH JOIN 또는 MERGE JOIN과 같은 보다 효율적인 조인 알고리즘을 사용하는 것을 방해합니다.
  • 이는 옵티마이저가 큰 테이블의 경우 계산 비용이 많이 드는 데카르트 곱을 생성하도록 강제합니다.

따라서 이러한 조건은 연결된 결과 집합을 사용하여 표현하는 것이 좋습니다. 위의 예에서는 다음과 같이 번역됩니다.

<code class="language-sql">SELECT  *
FROM    maintable m
JOIN    othertable o
ON      o.parentId = m.id
UNION ALL
SELECT  *
FROM    maintable m
JOIN    othertable o
ON      o.id = m.parentId</code>

동등 조인을 사용하고 결과를 연결함으로써 쿼리 최적화 프로그램은 성능 저하 없이 효율적으로 작업을 수행할 수 있습니다. 여기서는 UNION ALL을 사용하고, 중복 행을 제거하려면 UNION을 사용하세요.

위 내용은 INNER JOIN의 OR 조건이 성능 저하를 일으키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.