개발/TIL

[sql 튜닝] Chapter 4.3 해시 조인 4.4 서브쿼리 조인

ebang 2025. 5. 8. 22:00
  • NL 조인은 인덱스를 활용하기 때문에 논리적 IO 부하를 피할 수 없고, 버퍼 캐시 히트율에 따라 들쭉날쭉한 성능을 보인다.
  • 반면 소트머지조인, 해시 조인은 대용량 데이터 처리가 NL 조인보다 빠르며 인덱스를 활용하지 않기 때문에 성능이 일정하다. 그 중에서도 소트머지 조인은 항상 양쪽 테이블을 정렬해야하는데, 해시 조인은 그런 부담도 없다.
  • 해시 조인이 필요한 상황과 기본 메커니즘, 전체 조인 옵션의 사용하기 좋은 상황에 대해 알아본다.

4.3.1. 기본 메커니즘

  1. Build 단계 : 작은 테이블을 읽어서 해시 테이블(해시 맵)을 생성한다.
  • 조인 칼럼을 해시 테이블의 키로 해서 생성한다.
  • 해시 테이블은 PGA 영역의 Hash Area 에 저장한다.
  • (테이블을 읽는 과정은 DB 버퍼 캐시를 경유할 수 밖에 없다. )
  • 해시테이블에 저장하는 정보
  • 모든 데이터 정보. -> 그래야 DB 버퍼 캐시를 경유하면서 얻은 데이터를 다시 가져오지 않아도 되고 성능상 이점이 생기게 되는 것.
  1. Probe 단계 : 큰 테이블을 읽어서 해시 테이블에서 탐색해서 조인한다.
  • (테이블을 읽는 과정은 DB 버퍼 캐시를 경유할 수 밖에 없다. )
  • 이 과정은 NL 조인과 크게 다르지 않다.

  • 힌트 : use_hash
    5elect /*+ ordered use_hash{c) */
    e.사원번호, e.사원명,e. 입사일자, 
    c. 고객번호, c.고객명,c.전화번호,c.최종주문금액
    

from 사원 e , 고객 c
where c. 관리사원번호 = e 사원번호
and e 입사일자 >= '19960101'
and e. 부서코드 = 'Z123'
and c.최종주문금액 >= 20000



4.3.2. 해시 조인이 빠른 이유
- 기본적으로는 소트 머지 조인과 마찬가지로 PGA 영역에 데이터를 담아두고 조인을 하기 때문에, Latch 획득 과정이 생략되기 때문에 빠르다. 
- 소트머지 조인보다도 빠른 이유는, 소트 머지 조인은 양쪽 집합을 모두 정렬해두고 시작하는 작업이기 때문에, 한 쪽 집합이 크기가 좀만 크더라도 Temp 테이블 스페이스에 데이터를 저장하는 경우가 생긴다. 즉 Disk IO가 발생하는 것이다. 
- 반면 해시 조인은 두 테이블 중 더 작은 테이블을 골라서 해시 테이블을 생성해서 저장하기 때문에, 좀 더 낮은 확률로 Disk IO 가 발생한다. 또한 정렬하는 과정도 없다. 
- 설령 Temp 영역을 사용하게 된다고 하더라도, Hash Join이 더 빠르다. 

4.3.3. 대용량 Build Input 처리
- 두 테이블 모두 대용량 테이블이라서 인메모리 해시 조인이 불가능한 상황(해시 테이블 저장 위치, 결과 저장 위치가 인메모리에 저장할 수 없는 경우를 일컫는 것 같다. )
- 분할-정복 방식을 활용한다. (파티션 개념이 필요.)
- 

4.3.4. 해시 조인 실행계획 제어
- 조건 절에 대한 카다널리티가 작은 테이블을 Build Input 으로 선정한다. 
- 혹은 Build Input 을 힌트로 직접 선정한다. 
- swap_join_inputs(table)
- ![](https://i.imgur.com/p0j1gle.png)
- 테이블이 3개라고 하더라도 결국 2개씩 진행되기 때문에 순서만 잘 지정하면 된다. 
- no_swap_join_inputs(table) 로 Probe Input 을 지정하는 방법도 존재한다. 


4.3.5. 조인메소드 선택 기준
일반적인 메소드 선택 기준은 다음과 같다. 
![](https://i.imgur.com/3MJA58b.png)




- 소량 데이터 조인의 반대인 대량 데이터 조인 = 단순히 데이터량이 많은 것 뿐만 아니라, 인덱스를 충분히 최적화했음에도 불구하고 랜덤 IO 의 발생이 많은 경우. 
- 수행빈도가 매우 높은 쿼리라면
- ![](https://i.imgur.com/niatwWH.png)
- 왜 항상 먼저 NL 조인을 고려해야할까?
- 해시 조인이 아무리 PGA 영역에 테이블을 만들기 때문에 접근 성능이 빠르다고 해도, 하나의 쿼리를 위해서 테이블이 만들어지고 사라지는 과정 자체의 CPU, 메모리 사용량이 많고, 해시테이블을 만드는 과정의 Latch 도 존재하기 때문이다. 
- 해시 조인을 사용하는 조건은 다음과 같다. 
- ![](https://i.imgur.com/qxgM1lI.png)


4.4. 서브쿼리 조인
- 옵티마이저가 서브쿼리를 처리하는 방식을 이해한다. 
- 원하는 방식으로 실행계획을 제어해본다.