Join 연산
Join이란 SQL 명령문에 의해서 여러 테이블에 저장된 데이터를 한 번에 조회할 수 있게 하는 DBMS의 기능입니다. 두 테이블 간의 곱으로 데이터를 연결하는 가장 대표적인 데이터 연결 방법입니다. 대표적인 종류로 Nested-Loop Join, Sort-Merge Join, Hash Join 등이 존재합니다. 참고로 Join 연산은 Optimizer의 성능 및 DMBS 고유의 성능 그리고 Join 연산의 알고리즘에 의해서 속도 등의 차이가 있을 수 있습니다.
Nested Loop Join
Nested Loop의 개념
Nested Loop란 2개 이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대방 Row를 결합하여 원하는 결과를 조합하는 방식입니다. 먼저 선행 테이블의 처리 범위를 하나씩 액세스하면서 추출된 값으로 연결할 테이블을 조인합니다.
Nested Looop의 특징
- 좁은 범위에 유리한 성능을 보여줌
- 순차적으로 처리하며, Random Access 위주
- 후행 테이블에는 조인을 위한 인덱스 생성 필요
- 실행 속도 = 선행 테이블 사이즈 * 후행 테이블 접근 횟수
Nested Loop 사용 시 주의사항
- 데이터를 랜덤으로 액세스하기 때문에 결과 집합이 많으면 느려짐
- Join index가 없거나, Join 집합을 구성하는 검색조건이 Join 범위를 줄여주지 못할 경우 비효율적
- 테이블 중 Row 수가 적은 쪽을 Driven 테이블로 설정
Sort Merge Join
Sort Merge Join의 개념
Sort Merge Join이란 Join의 대상 범위가 넓을 경우 발생하는 Random Access를 줄이기 위한 경우나 연결고리에 마땅한 인덱스가 존재하지 않을 경우 해결하기 위한 조인 방안입니다. 양쪽 테이블의 처리 범위를 각자 Access하여 정렬한 결과를 차례로 Scan하면서 연결고리의 조건으로 Merge하는 방식입니다.
Sort Merge Join의 특징
- 연결을 위해 랜덤 액세스를 하지 않고 스캔을 하면서 수행
- Nested Loop Join처럼 선행 집합 개념이 없음
- 정렬을 하기 위한 영역에 따라 효율에 큰 차이가 발생
- Join 연산자가 ‘=’이 아닌 경우 Nested Loop Join보다 유리한 경우가 많음
Sort Merge Join 사용 시 주의사항
- 두 결과집합의 크기가 차이가 많이 나는 경우에는 비효율적
- Sorting 메모리에 위치하는 대상은 Join Key 뿐만 아니라 Select List도 포함되므로 불필요하면 Select 항목 제거
Hash Join
Hash Join의 개념
Hash Join이란 Hashing Function 기법을 활용하여 Join을 수행하는 방식입니다. 여기서 Hashing Function은 직접적인 연결을 담당하는 것이 아니라 연결될 대상을 특정 지역에 모아두는 역할만을 담당합니다. Sort Merge Join은 정렬의 부하가 많이 발생하여, 이를 보완하기 위한 바법으로 Sort 대신 해쉬값을 이용합니다.
Hash Join의 특징
- 대용량 처리의 선결조건인 랜덤 액세스와 정렬에 대한 부담을 해결
- Parallel processing을 이용한 Hash Joni은 대용량 데이터를 처리하기 위한 최적의 솔루션
- 2 개의 Join 테이블 중 small rowest를 가지고 hash_area_size에 지정된 메모리 내에서 Hash 테이블 생성
- CBO에서만 가능하며, CPU 성능에 의존적
- Hash 테이블 생성 후, Nested Loop처럼 순차적인 처리 형태로 수행
Hash Join 사용 시 주의사항
- 대용량 데이터 처리에는 상당히 큰 Hash Area를 필요로 함으로, 메모리의 지나친 사용으로 오버헤드 발생 가능성
- 연결 조건 연산자가 ‘=’인 동치 조인인 경우에만 가능