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