중첩 루프 조인이 왼쪽 조인 만 지원하는 이유는 무엇입니까?


11

Craig Freedman의 블로그 인 Nested Loops Join 에서 중첩 루프 조인이 올바른 외부 조인을 지원할 수없는 이유를 설명합니다.

문제는 외부 테이블의 각 행마다 한 번씩 내부 테이블을 여러 번 스캔한다는 것입니다. 이러한 다중 스캔 중에 동일한 내부 행이 여러 번 발생할 수 있습니다. 어떤 시점에서 우리는 특정 내부 행이 참여하지 않을 것이라고 결론 지을 수 있습니까?

누군가 간단하고 교육적인 방법으로 이것을 설명해 주시겠습니까?

루프가 외부 테이블 ( R1)로 시작 하고 내부 ( R2)를 스캔 한다는 의미 입니까?

R1참여하지 않는 값 의 경우 결과 집합이 ( ) 가되도록 값 R2으로 바꿔야한다는 것을 이해합니다 . 나를 위해 어떤 값을 반환 할지 알 수 없기 때문에 조인하지 않으면 값 을 반환하는 것이 불가능 해 보입니다 . 그러나 그것이 설명 된 방식이 아닙니다. 아니면?NULLNULL, R2R2R1R2

실제로 SQL Server는로 최적화하고 대체 RIGHT JOIN하는 LEFT JOIN경우가 많지만 문제는 로직 을 사용 / 지원 하는 것이 기술적으로 불가능한 이유를 설명 하는 NESTED LOOPS JOINRIGHT JOIN입니다.

답변:


12

여기서 주요 이슈 는 내부 루프외부 루프를 통해 액세스 되고 외부 테이블내부 루프를 통해 액세스 되는 논리적 방식과 반대되는 기술적 방식으로 중첩 루프를 사용하여 외부 조인을 구현 하는 것입니다 .

테이블 A와 B가 주어지면 구현해 봅시다 A LEFT JOIN B.

A
--
1
2

B
_
1
3

먼저, " 자연적인 "방법으로 해봅시다 .

A를 반복합니다.
레코드 1에 액세스
합니다. B를 반복합니다.
B에서 레코드 1을 찾고 출력 1-1을 찾습니다 .

우리는 A를 통해 반복을 반복합니다.
우리는 레코드 2에 액세스
합니다.
우리는 B를 통해 반복합니다. B 에서 일치하는 것을 찾을 수 없습니다.
우리는 2-null을 출력 합니다.

이제 " 반대 "방식으로 해봅시다 .

B를 반복합니다.
레코드 1에 액세스
합니다. A를 반복합니다. A
에서 레코드 1을 찾고 출력 1-1을 찾습니다 .

우리는 B를 통해 반복합니다.
우리는 레코드 3에 액세스
합니다.
우리는 A를 통해 반복합니다. A 에서 일치하는 것을 찾을 수 없습니다.

이제 이었다는 것을 기억 A LEFT JOIN B하는 수단, 그 외에 1-1 우리가해야 출력 이 null이 .
문제는 그 시점에서 어떤 레코드 id A에 대해 이미 일치하는지 (1), 어떤 레코드에 대해 일치하지 않는지 (2) 모른다는 것입니다.


이는 실제로 테이블 A에 대한 비트 배열을 보유함으로써 다양한 방법으로 해결할 수 있습니다.
A 레코드가 일치하는 것으로 발견되면 비트 배열에 표시합니다.
중첩 루프의 끝에서 우리는 비트 배열을 거쳐 표시되지 않은 레코드를 출력하고 출력합니다.
이것은 "자연적인"중첩 루프보다 훨씬 더 복잡합니다.


13

링크 된 기사에서 내가 싫어하는 것은 "중첩 루프 조인 알고리즘이 오른쪽 조인의 논리적 조인 연산자를 지원하지 않는다" 는 진술입니다 .

제한이 있지만이 시점의 문구는 약간 혼동됩니다. 다음 내용이 더 잘 설명되기를 바랍니다.

중첩 베다 알고리즘 명명 된 (이전 연산의 기본 테이블 또는 결과 집합 관련성 여부) 두 테이블을 포함 조인 외부내부 (이하 "외부"테이블이 외부로 이송되는 테이블들은 알고리즘에 의해 다른 방식으로 처리된다 루프 및 내부 루프의 "내부"테이블).

따라서 조인이 있다고 가정 해 보겠습니다.

A (some_type) JOIN B

알고리즘은 다음 중 하나로 실행될 수 있습니다.

outer-loop-A  nested-loop  inner-loop-B

또는:

outer-loop-B  nested-loop  inner-loop-A

이제 ( some_type)가 INNER또는 CROSS조인 인 경우 제한이 없으면 플래너는 두 가지 방법 중 하나를 선택할 수 있습니다 (세트의 크기, 조인 된 열의 값 분포, 인덱스 등에 따라 다른 성능 특성). 일반적으로 가장 작은 테이블은 알고리즘의 "외부"테이블로 선택됩니다.

그러나 때 some_type입니다 LEFT조인 만 사용할 수 있습니다 :

outer-loop-A  nested-loop  inner-loop-B

그리고 아닙니다

outer-loop-B  nested-loop  inner-loop-A

또한 RIGHT항상 LEFT조인 으로 다시 작성할 수 있으므로 반대의 경우와 동일한 제한이 있습니다. 의 경우 A RIGHT JOIN B다시 B LEFT JOIN A작성할 수 있습니다.

outer-loop-B  nested-loop  inner-loop-A

그리고 다른 방법은 아닙니다 * .

좌-세미 조인, 좌-세미 조인, 우-세미 조인 및 우-안티-세미 조인에 대해서도 동일한 제한이 적용된다.

반면에 FULL조인은 중첩 루프 조인 알고리즘으로 직접 처리 할 수 ​​없습니다. 이 기사는 왼쪽 조인과 왼쪽 반 세미 조인을 합쳐서 전체 조인을 다시 작성하고 최적화하는 방법을 설명합니다. 노동 조합).

* 으로 두두 Markovitz는 그의 대답에 설명, 반대 방법은 별도의 구조와 결국에는 추가 단계를 가지고하는 데 사용하지만, 우리가 중첩 된 루프를 수정 한 경우에만 알고리즘을 결합 할 수있을 것입니다.


글쎄, 그것은 많은 것을 명확히했다. Dudu M : s와 함께 당신의 대답은 그것을 잘 설명합니다!
GordonLiddy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.