4.3장 해시 조인

친절한 SQL 튜닝 4.3장

해시 조인이란

  • 소트 머지 조인과 마찬가지로 인덱스를 이용하지 않는 조인이다.

  • 대량의 데이터 조인할 때 NL조인보다 훨씬 빠르고, 일정한 성능을 보인다.

  • 소트 머지 조인과는 다르게, 양쪽 테이블 정렬의 부담이 없다.

1. 기본 메커니즘

단계
설명

1단계

조인 대상 중 작은 테이블(또는 선행 테이블)을 PGA에 해시 테이블로 만든다

2단계

나머지 테이블을 한 줄씩 읽으며 해시 테이블과 매칭한다

  • 이 작업은 모두 PGA에서 수행되며, 메모리가 부족하면 TEMP 디스크를 사용하게 됨

  • 해시 조인은 **동등 조인(=)**에서만 사용 가능

2. 왜 해시 조인이 빠를까?

이유
설명

정렬이 불필요

소트 머지 조인과 달리 정렬 과정이 없음 → 성능 유리

인덱스 미사용 가능

인덱스 없어도 조인 가능 → 옵티마이저의 선택 폭이 넓음

단순한 해시 탐색

해시 버킷으로 한 번에 위치 확인 → 반복 검색보다 빠름

소트 머지 조인보다 빠른 이유?

조인을 시작하기 전, 양쪽을 정렬해서 PGA에 담는 작업에서 차이난다.

  • 정렬 없이 바로 해시 테이블을 만들어서 비교만 하기 때문에 연산 자체가 훨씬 단순하고 빠름.

  • Build Input 테이블만에 작은 집합을 저장하므로 Temp 테이블스페이스에 쓰는 작업이 거의 없다.

해시 조인은 정렬 없이 조인을 수행할 수 있고, 작은 테이블을 메모리에 올려 빠르게 탐색하기 때문에 대용량 테이블에도 유리한 경우가 많다.

특히 인덱스가 없거나, 정렬이 비효율적인 경우에 효과적이다.

3. 대용량 Build Input 처리 방식

상황
처리 방식

Build Input이 메모리에 다 안 들어감

Oracle은 해시 테이블을 나눠서 TEMP에 저장

→ 파티셔닝 조인 수행

조인 조건별로 조각내서 다시 해시 빌드 후 조인

이 과정을 파티셔닝 **해시 조인(partitioned hash join)**이라고 함

4. 실행계획 제어

제어 방식
예시

힌트 사용

USE_HASH(A) : A를 Build 테이블로 해시 조인 강제

조인 순서 지정

ORDERED 힌트로 선행 테이블 지정 가능

인덱스 무시

NO_INDEX(A)로 인덱스 사용을 막고 해시 조인 유도

옵티마이저가 기본적으로 해시 조인을 선택할 수도 있지만, 우리가 USE_HASH, ORDERED, NO_INDEX 같은 힌트를 사용하면 조인 방식과 순서를 직접 지정할 수 있다. 특히 튜닝 시 중요한 전략이.

5. 옵티마이저의 조인 메소드 선택 기준

조건
선택되는 조인 방식

인덱스 존재 + 소량 데이터

NL Join

정렬 가능 + 대용량 데이터

Sort Merge Join

인덱스 없음 + 해시 조인 효율적

Hash Join

해시 조인은 동등 조건 + 인덱스 없음 + 대용량 처리에 최적화된 방식

옵티마이저는 상황에 따라 자동으로 조인 방식을 결정하지만, 인덱스가 없고 조인 조건이 단순하다면 해시 조인이 가장 유력하다. 실제 실행계획을 보고 튜닝 포인트를 잡는 게 중요하다.

결론

해시 조인은 작은 테이블을 해시 테이블로 만들고 빠르게 비교하는 방식

→ PGA 크기, 입력 데이터 크기, 조인 조건에 따라 성능이 크게 좌우됨

Last updated