NL 조인은 인덱스를 이용한 조인 방식이므로 인덱스 구성에 따른 성능 차이가 심하다.
인덱스를 아무리 완벽하게 구현해도 랜덤 I/O 때문에 대량 데이터 처리 불리하고, 버퍼캐시 히트율에 따라 들쭉날쭉한 성능을 보인다.
소트 머지 조인과 해시 조인은 조인 과정에 인덱스를 이용하지 않기 때문에 대량 데이터 조인할 때 NL 조인보다 훨씬 빠르고, 일정한 성능을 보인다.
소트 머지 조인은 항상 양쪽 테이블을 정렬하는 부담이 있는데, 해시 조인은 그런 부담도 없다
해시 조인 기본 메커니즘
해시 조인은 두 단계로 진행된다.
1. Build 단계 : 작은 쪽 테이블 (Build Input)을 읽어 해시 테이블(해시 맵)을 생성.
2. Probe 단계 : 큰 쪽 테이블(Probe Input)을 읽어 해시 테이블을 탐색하며 조인.
Build 단계의 예시
SELECT 사원번호, 사원명, 입사일자
FROM 사원
WHERE 입사일자 >= '19960101'
AND 부서코드 = 'Z123'
위 조건에 해당하는 사원데이터를 읽어 해시 테이블을 생성, 조인컬럼인 사원번호를 해시 테이블 키 값으로 사용.
사원번호를 해시 함수에 입력해서 반환 값으로 해시 체인을 찾고 해시 체인데 데이터를 연결.
해시 테이블은 PGA 영역에 할당된 Hash Area에 저장.
해시 테이블이 너무 커 PGA에 담을 수 없으면 Temp 테이블 스페이스에 저장
Probe 단계의 예시
SELECT 고객번호, 고객명, 전화번호, 최종주문금액, 관리사원번호
FROM 고객
WHERE 최종주문고객 >= 20000
위 조건에 해당하는 고객 데이터를 하나씩 읽어 앞서 생성한 해시 테이블을 탐색.
관리사원번호를 해시 함수에 입력해서 반환된 값으로 해시 체인을 찾고, 그 해시 체인을 스캔해서 값이 같은 사원번호를 찾는다.
찾게되면 조인에 성공한 것이고, 못 찾으면 실패한 것이다.
해시 조인이 빠른 이유
해시 조인이 NL 조인 보다 빠른 이유는 소트 머지 조인이 빠른 이유와 같다.
해시 테이블을 PGA 영역에 할당하기 때문.
NL 조인은 Outer 테이블 레코드마다 Inner 쪽 테이블 레코드를 읽기 위해 래시 획득 및 캐시버퍼 체인 스캔 과정을 반복하지만, 해시 조인은 래치 획득 과정없이 PGA에서 빠르게 데이터를 탐색하고 조인.
해시 테이블에 담기는 정보
해시 테이블에는 조인 키값뿐만이 아니라 SQL에 사용한 컬럼을 모두 저장.
대용량 Build Input 처리
두 테이블 모두 대용량 테이블이어서 인메모리 해시 조인이 불가능한 상황이라고 가정했을때
분할 / 정복. 두 단계로 나눠서 진행하면 해시 조인 처리가 가능하다
파티션 단계
조인하는 양쪽 집합의 조인 컬럼에 해시 함수를 적용 및 반환된 해시 값에 따라 동적으로 파티셔닝.
[독립적으로 처리할 수 있는 여러 개의 작은 서브 집합으로 분할함으로써 파티션 짝을 생성하는 단계]
양쪽을 읽어 디스크 Temp 공간에 저장해야하므로 인메모리 해시 조인보다 성능이 많이 떨어진다
조인 단계
파티션 단계를 완료하면 각 파티션 짝에 대해 하나씩 조인을 수행. 각각에 대한 Build Input과 Probe Input은 독립적으로 결정된다.
파티션하기 전 어느 쪽이 작은 테이블이었는지에 상관없이 각 파티션 짝 별로 작은 쪽을 Build Input으로 선택하고 해시 테이블 생성.
생성하고 나면 반대쪽 파티션 로우를 하나씩 읽으면서 해시 테이블을 탐색한다
조인 메소드 선택 기준
1. 소량 데이터 조인할 때 → NL 조인
2. 대량 데이터 조인할 때 → 해시 조인
3. 대량 데이터 조인인데 해시 조인으로 처리할 수 없을때 → 소트 머지 조인
[ 조인 조건식이 등치 (=) 조건이 아닐 때 ]
수행빈도가 매우 높은 쿼리에 대한 예시 기준
1. 최적화된 NL 조인과 해시 조인 성능이 같으면 , NL 조인
2. 해시 조인이 약간 더 빨라도 NL 조인 ( CPU를 덜 쓰게 하기 위해서 )
3. NL 조인보다 해시 조인이 매우 빠른 경우, 해시 조인
결론적으로 해시 조인은 세가지 조건을 만족하는 SQL문에 주로 사용한다.
1. 수행 빈도가 낮음
2. 쿼리 수행 시간이 오래걸림
3. 대량 데이터 조인할 때
'SQL > 심화' 카테고리의 다른 글
SQL튜닝 - Chapter05. 소트 튜닝 (0) | 2023.08.22 |
---|---|
SQL튜닝 -Chapter04.조인튜닝 -4- 서브퀴리 조인 (0) | 2023.08.22 |
SQL튜닝 - Chapter04.조인튜닝 -2- 소트 머지 조인 (0) | 2023.08.21 |
SQL튜닝 - Chapter04.조인튜닝 -1- NL조인 (0) | 2023.08.19 |
SQL튜닝 - Chapter03. 인덱스튜닝 -2- (0) | 2023.08.18 |