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
접근 방식을 사용하면 옵티마이저가 보다 효율적인 전략을 사용할 수 있습니다. 따라서 항상 문제가 되는 것은 아니지만 OR
의 JOIN
조건을 신중하게 고려하고 잠재적으로 최적의 성능을 위해 리팩터링해야 합니다.
위 내용은 성능 향상을 위해 'OR' 조건을 사용하여 SQL INNER JOIN 쿼리를 어떻게 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!