> 데이터 베이스 > MySQL 튜토리얼 > INNER JOIN 조건에서 'OR'을 사용하면 SQL 성능에 항상 나쁜 영향을 미치나요?

INNER JOIN 조건에서 'OR'을 사용하면 SQL 성능에 항상 나쁜 영향을 미치나요?

Barbara Streisand
풀어 주다: 2025-01-10 19:01:41
원래의
697명이 탐색했습니다.

Is Using

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 JOINUNION 또는 LEFT JOINCASE 문 포함)은 일반적으로 우수한 성능을 제공합니다. 이를 통해 쿼리 최적화 프로그램은 가장 효율적인 알고리즘을 활용할 수 있습니다.

위 내용은 INNER JOIN 조건에서 'OR'을 사용하면 SQL 성능에 항상 나쁜 영향을 미치나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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