> 데이터 베이스 > MySQL 튜토리얼 > 성능 향상을 위해 'OR' 조건을 사용하여 SQL INNER JOIN 쿼리를 어떻게 최적화할 수 있습니까?

성능 향상을 위해 'OR' 조건을 사용하여 SQL INNER JOIN 쿼리를 어떻게 최적화할 수 있습니까?

Susan Sarandon
풀어 주다: 2025-01-10 18:56:42
원래의
274명이 탐색했습니다.

How Can I Optimize SQL INNER JOIN Queries with 'OR' Conditions for Improved Performance?

SQL 최적화 INNER JOIN 'OR' 조건이 포함된 쿼리: 성능 분석

최근 SQL Server 2008 쿼리의 성능 병목 현상은 OR 내의 INNER JOIN 조건으로 인해 발생했습니다. 두 개의 테이블(각각 50,000개의 행만 포함)이 포함된 원래 쿼리는 상당한 속도 저하를 보였습니다.

다음 JOIN 조건을 사용한 비효율적인 쿼리:

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
로그인 후 복사

한 쌍의 LEFT JOIN을 사용하여 리팩토링되어 성능이 크게 향상되었습니다(몇 분에서 약 1초로).

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
로그인 후 복사

이런 질문이 제기됩니다. OR 절 내의 JOIN 조건을 피해야 할까요? 보편적으로 해롭지는 않지만 성능에 미치는 영향을 이해하는 것이 중요합니다.

핵심 문제는 옵티마이저의 한계에 있습니다. JOIN 조건이 있는 OR은 HASH JOIN 또는 MERGE JOIN과 같은 최적화된 조인 방법을 활용할 수 없습니다. 쿼리의 논리는 본질적으로 UNION:

를 사용하여 결합된 두 개의 개별 조인과 동일합니다.
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 최적화 프로그램은 이러한 동등성을 인식하지 못하여 특히 대규모 데이터 세트의 경우 실행 계획의 효율성이 떨어질 수 있습니다. 대조적으로 LEFT JOIN 접근 방식을 사용하면 옵티마이저가 보다 효율적인 전략을 사용할 수 있습니다. 따라서 항상 문제가 되는 것은 아니지만 ORJOIN 조건을 신중하게 고려하고 잠재적으로 최적의 성능을 위해 리팩터링해야 합니다.

위 내용은 성능 향상을 위해 'OR' 조건을 사용하여 SQL INNER JOIN 쿼리를 어떻게 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿