본문 바로가기
Database

조인 수행원리

by oncerun 2021. 5. 1.
반응형

조인이란 두 개 이상의 테이블을 하나의 집합으로 만드는 연산이다.

테이블 또는 조인 결과를 이용하여 조인을 수행할 때 조인 단계별로 다른 조인 기법을 사용할 수 있다.

 

예를 들어 A, B, C 3개의 테이블을 조인한다고 했을 때

(A JOIN B) -> ((A JOIN B) JOIN C)와 같이 2번의 조인 연산이 이루어진다. 이때 각각 다른 조인 기법을 사용할 수 있는 것이다.

 

많이 사용되는 조인 기법을 알아보자

 

NL JOIN

 

 NLJOIN은 프로그래밍에서 사용하는 중첩된 반복문과 유사한 방식으로 조인을 수행한다. 반복문의 외부에 있는 테이블을 선행 테이블이라고 하고 반복문 내부에 있는 테이블을 후행 테이블이라고 한다.

 

먼저 선행테이블의 조건을 만족하는 행을 추출하여 후행 테이블을 읽으면서 조인을 수행한다.

이 작업은 선행테이블의 조건을 만족하는 모든 행의 수만큼 반복한다. 따라서 NLJOIN에서는 선행 테이블의 조건을 만족하는 행의 수가 많으면 그만큼 후행 테이블의 조인 작업은 반복 수행된다.

 

따라서 결과 행의 수가 적은 테이블을 조인 순서상 선행 테이블로 선택하는 것이 전체 일 량을 줄일 수 있다.

 

NLJOIN은 랜덤 방식으로 데이터를 액세스 하기 때문에 처리 범위가 좁은 것이 유리하다고 할 수 있습니다.

 

* 랜덤 액세스는 데이터를 저장하는 블록을 한 번에 여러개 액세스 하는 것이 아닌 한번에 하나씩 하는 방식입니다.

 

SORT MERGE JOIN

 

- 조인 칼럼을 기준으로 데이터를 정렬하여 조인을 수행한다. NLJOIN은 주로 랜덤 액세스 방식으로 데이터를 읽는 반면 이 SORT MEGER JOIN은 주로 스캔 방식으로 데이터를 읽는다.

랜덤 액세스로 NLJOIN에서 부담이 되던 넓은 범위의 데이터를 처리할 때 이용되던 JOIN기법이다.

 

중간 정리를 한번 하자만 선행 테이블의 조건을 만족하는 결과 행의 수가 있고 해당 행을 가지고 외부 테이블과 조인을 할 때 랜덤 액세스가 읽어 나면 한 번에 하나씩 I/O가 발생하여 반복적으로 여러번 일어나지만 스캔 방식은 한번에 여러 개의 데이터를 읽기 때문에 반복 횟수가 적어 성능적으로 유리하다는 것

 

그러나 조인 칼럼을 기준으로 정렬 연산이 일어나고 정렬할 데이터가 많다면 메모리에서 모든 정렬 작업을 수행하기 어려운 경우 임시 하드디스크 영역을 사용하기 때문에 성능이 무척 안 좋을 수 있다. 일 만적으로 대량 조인 작업에서 정렬 작업을 필요로 하는 SORT MEGER JOIN보다는 CPU 작업 위주로 처리하는 HASH JOIN이 성능상 유리하다.

 

그러나 소프트 머지 조인은 해시 조인과 달리 동등 조인뿐만 아니라 비 동등 조인에 대해서도 조인 작업이 가능하다는 장점이 있다. 또 조인 칼럼의 인덱스를 사용하지 않기 때문에 조인 칼럼 인덱스가 존재하지 않는 경우에도 사용할 수 있는 조인 기법이다. (어차피 조인 칼럼을 정렬하기 때문)

 

HASH JOIN

 

- 해싱 기법을 이용하여 조인을 수행한다. 조인을 수행할 테이블의 조인 칼럼을 기준으로 해쉬 함수를 수행하여 서로 동일한 해시 값을 갖는 것들 사이에서 실제 값이 같은지를 비교하면서 조인을 수행한다.

 

해시 조인은 NLJOIN의 랜덤액세스 + SMJ의 정렬작업의 부담을 해결하기 위한 대안으로 등장하였다.

해시 조인은 조인칼럼의 인덱스를 사용하지 않기 때문에 조인 컬럼의 인덱스가 존재하지 않는 경우데ㅗ 사용할 수 있는 조인기법이다. 다만 해시조인은 해시함수를 이용하기 때문에 동등 조인에서만 사용할 수 있다.

 

*동등 조인 비 동등 조인은 앞에서 설명했습니다.

 

해시 조인은 조인 작업을 수행하기 위해 해시 테이블을 메모리에 생성해야 하는데  해시 테이블의 크기가 커지게 되면 디스크에 해시 테이블을 저장하여 성능이 안 좋아질 수 있습니다. 따라서 해시 조인을 할 경우에는 결과 행수가 작은 테이블을 선행 테이블로 선택해야 한다. 즉 선행 테이블의 조건 결과를 완전히 메모리에 저장할 수 있다면 임시 영역에 저장하는 추가적인 작업이 필요하지 않다는 것을 의미합니다. 

다만 해시 테이블은 언제나 충돌 가능성이 있고 이것은 벤더사에서 어떻게 해결하고 방법에 대해서 공식문서로 제공해 줍니다.

반응형

'Database' 카테고리의 다른 글

파티션 테이블  (0) 2021.05.22
파일 구조(file organization)  (0) 2021.05.02
인덱스의 기본  (0) 2021.05.01
실행계획 (Execution Plan)  (0) 2021.05.01
SQL 최적화의 기본원리  (0) 2021.05.01

댓글