해쉬 조인 원리를 알아보자!
NL 조인
은 대용량 테이블 조인시 불리하다.
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 순으로 조인을 해야 한다.
크기가 작다고 해서, 무조건 작은 순으로 조인할 수 없다.
이때, 내가 원하는 테이블을 해시 테이블로 바꾸는 힌트가 바로 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;