왼쪽 외부 조인에 대한 SQL 성능이 존재하지 않음
표 A에서 항목 집합을 찾지만 표 B에서는 찾을 수 없는 경우 왼쪽 외부 조인 또는 존재하지 않음을 사용할 수 있습니다.SQL Server는 ANSI를 지향하며 어떤 경우에는 LEFT OUTER JOIN이 존재하지 않는 것보다 훨씬 더 효율적이라고 들었습니다.이 경우 ANSI JOIN이 더 나은 성능을 발휘할 수 있을까요?조인 연산자가 SQL Server에 일반적으로 존재하지 않는 것보다 더 효율적입니까?
Joe의 연결고리는 좋은 출발점입니다.Quassnoi는 이것도 다룹니다.
일반적으로 필드가 올바르게 인덱싱되었거나 더 많은 레코드를 필터링할 것으로 예상되는 경우(즉, 하위 쿼리에 행이 많음)NOT EXISTS
더 나은 성능을 발휘할 것입니다.
EXISTS
그리고.NOT EXISTS
양쪽 단락 - 레코드가 기준에 일치하는 즉시 포함되거나 필터링되고 최적화 도구가 다음 레코드로 이동합니다.
LEFT JOIN
일치 여부에 관계없이 모든 레코드를 조인한 다음 일치하지 않는 모든 레코드를 필터링합니다.테이블이 크거나 여러 개인 경우JOIN
기준, 이것은 매우 많은 리소스를 소모할 수 있습니다.
나는 보통 사용하려고 노력합니다.NOT EXISTS
그리고.EXISTS
가급적이면SQL 서버의 경우,IN
그리고.NOT IN
는 의미론적으로 동일하며 쓰기가 더 쉬울 수 있습니다.이러한 연산자는 SQL Server에서 단락이 보장되는 유일한 연산자 중 하나입니다.
개인적으로, 저는 이것이 "It Depends"라는 오래된 것이라고 생각합니다.저는 각 방법이 다른 방법보다 성능이 우수한 사례를 보았습니다.
둘 다 테스트하고 어느 것이 더 나은 성능을 발휘하는지 확인하는 것이 최선입니다.테이블이 항상 작을 것이고 성능이 그렇게 중요하지 않은 상황이라면 저는 당신에게 가장 명확한 것을 선택할 것입니다.NOT EXISTS
다음 단계로 이동합니다.
dba.stack 교환에 대한 답변
내가 알아챈 예외는NOT EXISTS
(비록) 근소하게 우세한.LEFT JOIN ... WHERE IS NULL
연결된 서버를 사용하는 경우입니다.
실행 계획을 검토한 결과,NOT EXISTS
연산자는 중첩된 루프 방식으로 실행됩니다.행 단위로 실행되는 방식입니다(말이 된다고 생각합니다).
이러한 동작을 보여주는 실행 계획의 예:
이 블로그 항목은 동일한 결과를 얻기 위한 다양한 방법(NOT IN, OUTER APLY, LEFT OUTER JOIN, EXCUTY 및 NOT EXPREST)의 예를 제시하며, 콜드 캐시 및 웜 캐시 시나리오에서 Not Exists(Left Anti Semi Join)가 최상의 옵션임을 증명합니다.
언급URL : https://stackoverflow.com/questions/6777910/sql-performance-on-left-outer-join-vs-not-exists
'programing' 카테고리의 다른 글
시간 지연이 있는 작업을 반복하시겠습니까? (0) | 2023.08.02 |
---|---|
PHP를 사용하는 Oracle에서 선택된 행 수 계산 (0) | 2023.08.02 |
"이것.앱inits[i]는 함수가 아닙니다. (0) | 2023.08.02 |
코드에서 SceneKit SCNskinner 개체를 만드는 방법은 무엇입니까? (0) | 2023.08.02 |
처리되지 않은 약속거부 경고:유형 오류: Jest + Angular를 사용하여 원형 구조를 JSON으로 변환하는 중 (0) | 2023.08.02 |