OUTER JOIN의 조인 순서와 해쉬 테이블 구성 방법을 알아보자.
select e.ename, d.loc
from emp e, dept d
where e.deptno(+) = d.deptno;
위의 sql은 dept 테이블을 기준으로 left outer join을 하는 거랑 똑같다.
위와 같은 경우는 조인 순서가 dept->emp
가 된다. 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;
위와 같은 경우는 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(+);
--원래 순서 : emp->dept
조인 순서가 정해져있기 때문에, 해시 테이블을 dept 테이블로 지정할 수 없다.
이럴 때 쓰는 힌트가 있다!
swap_join_inputs()
힌트를 사용하면 된다!
select /*+ gather_plan_statistics leading(d e) use_hash(e)
swap_join_inputs(d) */ e.ename, d.loc
from emp e, dept d
where e.deptno=d.deptno(+);