[Oracle] HASH JOIN

당당·2023년 12월 29일
0

Oracle

목록 보기
40/51

📔설명

해쉬 조인 원리를 알아보자!


🍔HASH JOIN 원리

NL 조인은 대용량 테이블 조인시 불리하다.

  • use_hash 힌트
select /*+ gather_plan_statistics leading(d e) use_hash(e) */
e.ename, d.loc
from emp e, dept d
where e.deptno=d.deptno;

hash 조인 사용시, 오라클 메모리 영역인 PGA에 테이블이 불려지는데, 위의 sql에선 dept 테이블이 간다. dept 테이블이 상대적으로 크기가 작기 때문이다.

dept테이블에 있는 ROWID가 없어지고, 새로운 주소해쉬 값을 할당받게 된다.
조인시, e.deptno를 해시 함수에 넣어 해쉬값을 비교해서 조인하게 된다.

여기서, emp 테이블이 prob 테이블이 되고 dept 테이블이 해시 테이블이 된다.


🥫검색조건이 있을 때 해쉬조인 순서

select /*+ gather_plan_statistics leading(d e) use_hash(e) */ e. ename, d.loc
from emp e, dept d
where e.deptno=d.deptno
and e.job='SALESMAN'
and d.loc='CHICAGO';

위의 sql에서 건수가 작은 것을 선두로 해야 한다. d.loc='CHICAGO'를 만족하는 행이 1건이기 때문에, d->e 순으로 조인을 해야 한다.


🍟3개 이상 테이블 해시 조인

크기가 작다고 해서, 무조건 작은 순으로 조인할 수 없다.

이때, 내가 원하는 테이블을 해시 테이블로 바꾸는 힌트가 바로 swap_join_inputs(테이블명) 이다.

select /*+ gather_plan_statistics leading(t s p) use_hash(s) use_hash(p) full(t) full(s) full(p) */
p.prod_name, t.CALENDAR_YEAR, sum(s.amount_sold)
from sales100 s, times100 t, products100 p
where s.time_id=t.time_id
and s.prod_id=p.prod_id
group by p.prod_name, t.calendar_year;

검색 조건이 있을 때는, 2개 테이블 조인과 똑같이 결과 건수가 작은 것을 먼저 쓰면 된다.

select /*+ gather_plan_statistics leading(p s t) use_hash(s) use_hash(t) swap_join_inputs(t) */
    p.prod_name, t.CALENDAR_YEAR, sum(s.amount_sold)
from sales100 s, times100 t, products100 p
where s.time_id=t.time_id
and s.prod_id=p.prod_id
and t.CALENDAR_YEAR in (2000,2001)
and p.prod_name like 'Deluxe%'
group by p.prod_name, t.calendar_year;
profile
MySQL DBA 신입

0개의 댓글