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