19. JOIN의 종류와 특징

SQL Server에는 3가지 종류의 JOIN이 있다.

Nested Loop Join, Merge Join, Hash Join

 

(1) Nested Loop Join NL조인

NL조인은 주로 작은 입력을 인덱스를 사용해 조인 할 때 효과적이다.

메모리를 사용하지 않고 OLTP처럼 한번에 처리하는 단위가 작고 정렬이 적은 환경에 적합하다.

동작하는 방식은 말 그대로 중첩 반복문 형식이다.

외측 테이블, 내측 테이블이 존재하고 외측 참조 테이블의 입력에서 행을 한개씩 가져와서 내측 테이블을 반복해서 탐색하는 조인이다.

외측(선행) 테이블이 기준이 되므로 외측 테이블의 데이터가 작으면 작을수록 성능이 좋다.

 

1. 선행 테이블에서 조건을 만족하는 첫 번째 행을 찾음

2. 선행 테이블의 조인 키를 가지고 후행 테이블에 조인 키가 존재하는지 찾음

3. 후행 테이블의 인덱스에 선행 테이블의 조인 키가 존재하는지 확인

4. 인덱스에서 추출한 레코드 식별자를 이용하여 후행 테이블을 액세스. 만족시 해당 행을 추출버퍼에 넣음

5 ~ 11 번은 앞의 작업을 반복합니다.

 

 

(2) Merge Join, Sort Merge Join

두 Join 입력이 작지 않지만 Join 열을 (인덱스로부터 미리) 정렬된 상태로 가져올 수 있는 경우 가장 빠른 방법이다.

조인할 양쪽 입력 조인 조건을 기준으로 정렬을 한 후에 앞에서부터 순차 비교를 하면서 조인한다.

테이블을 읽는 작업은 정렬을 할 때 1번만 발생하기 때문에 부하가 없고, 정렬된 입력을 사용해 순차 비교를 하기 때문에 인덱스를 사용할 때 발생되는 추가 비용도 발생하지 않는다. 

하지만 머지 조인은 정렬하기 위한 메모리가 필요하므로 메모리가 부족하면 성능저하가 발생한다.

1. 선행 테이블에서 주어진 조건을 만족하는 행을 찾음

2. 선행 테이블의 조인 키를 기준으로 정렬 작업을 수행

1 ~ 2번 작업을 선행 테이블의 조건을 만족하는 모든 행에 대해 반복 수행

3. 후행 테이블에서 주어진 조건을 만족하는 행을 찾음

4. 후행 테이블의 조인 키를 기준으로 정렬 작업을 수행

3 ~ 4번 작업을 후행 테이블의 조건을 만족하는 모든 행에 대해 반복 수행

5. 정렬된 결과를 이용하여 조인을 수행하며 조인에 성공하면 추출버퍼에 넣음

 

 

(3) Hash Join

해시 조인은 인덱스를 사용할 수 없는 환경에서 결과를 정렬할 필요가 없을 때 효율적이다.

Join 입력의 크기가 크고 정렬되지 않았으며 인덱싱되지 않은 입력을 효율적

1. 선행 테이블에서 주어진 조건을 만족하는 행을 찾음

2. 선행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해쉬 테이블을 생성. 조인 컬럼과 SELECT 절에서 필요로 하는 컬럼도 함께 저장됨

1 ~ 2 번 작업을 선행테이블의 조건을 만족하는 모든 행에 대해 반복 수행

3. 후행 테이블에서 주어진 조건을 만족하는 행을 찾음

4. 후행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해당 버킷을 찾음

5. 조인에 성공하면 추출버퍼에 넣음

3 ~5 번 작업을 후행 테이블의 조건을 만족하는 모든 행에 대해서 반복 수행

 

+ Recent posts