select /*+ leading(e,d,s) use_hash(d) use_nl(s) */ e.ename, d.loc, s.grade
from emp e, dept d, salgrade s
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal;
select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
문제1. 위의 sql이 아래와 같이 조인순서와 조인방법이 결정되게끔 힌트를 주시오. salgrade ------------> emp ------------> dept ↑ ↑ sort merge join nested loop join
select /*+ leading(s,e,d) use_merge(e) use_nl(d) */ e.ename, d.loc, s.grade
from emp e, dept d, salgrade s
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal;
select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
문제2. 위의 SQL에서 부서위치가 DALLAS 의 데이터만 출력하시오
select e.ename, d.loc, s.grade
from emp e, dept d, salgrade s -- 14 / 4 /5 건
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal
and d.loc='DALLAS'; --1건
만약에 방금 위와 같이 dept 와 emp 를 조인했을때 5만건이 결과 데이터로 생성되었다라고 가정하고 아래의 SQL의 힌트를 주시오 !
select /*+ leading(d,e,s) use_nl(e) use_merge(s) */ e.ename, d.loc, s.grade
from emp e, dept d, salgrade s
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal
and d.loc='DALLAS';
문제 3. 아래의 SQL의 조인순서와 조인 방법을 결정하는데 다음과 같은 상황이라고 가정하고 조인순서와 조인방법을 결정하시오. salgrade ------------> emp ------------> dept (10만건) (12건)
select /*+ leading(s, e, d) use_merge(e) use_nl(d) */ e.ename, d.loc, s.grade
from emp e, dept d, salgrade s
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal;
select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));