INNER JOIN
이 포함된 SQL OR
: 성능 병목 현상
최근 성능 최적화 노력에서 OR
조건 내에서 INNER 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
의 대폭 향상된 성능을 사용하여 다시 작성:
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
이 느린 이유
핵심 문제는 OR
조건의 JOIN
이 SQL Server 최적화 프로그램이 효율적인 HASH
또는 MERGE
조인을 활용하지 못한다는 것입니다. 이러한 최적화된 조인 방법은 일반적으로 빠른 쿼리 실행에 중요합니다. OR
조건은 서버가 두 개의 개별 동등 조인에 대한 쿼리의 동등성을 인식하지 못하게 합니다.
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가 덜 효율적인 실행 계획을 선택하게 되어 성능이 저하됩니다.
모범 사례: OR
조건JOIN
에서
엄격하게 금지되지는 않지만 OR
조건에서 JOIN
을 사용하면 종종 최적화를 방해하고 성능 저하를 초래합니다. 여러 조인 조건의 경우 별도의 동등 조인(위에 표시된 LEFT JOIN
및 UNION
또는 LEFT JOIN
과 CASE
문 포함)은 일반적으로 우수한 성능을 제공합니다. 이를 통해 쿼리 최적화 프로그램은 가장 효율적인 알고리즘을 활용할 수 있습니다.
위 내용은 INNER JOIN 조건에서 'OR'을 사용하면 SQL 성능에 항상 나쁜 영향을 미치나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!