h1.06.조인 제거
예시
select e.empno, e.ename, e.sal, e.hiredate
from dept d, emp e
where d.deptno = e.deptno
-------------------------------------------
| Id | Operation | Name | E-Rows |
-------------------------------------------
| 0 | SELECT STATEMENT | | |
|* 1 | TABLE ACCESS FULL| EMP | 7013 |
-------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("E"."DEPTNO" IS NOT NULL)
FK가 설정되어있더라도 해당 컬럼이 NULL 허용 컬럼이면 결과가 틀려질 수 있으므로 옵티마이저가 해당컬럼 IS NOT NULL 조건을 추가해준다.
이 기능을 제어하는 파라메터 아래와 같고 eliminate_join, no_eliminate_join 힌트를 통해서도 제어할 수 있다.
alter session set "_optimizer_join_elimination_enabled" = false;
11g 부터는 outer join에서도 이 기능이 작동한다.
select e.empno, e.ename, e.sal, e.hiredate
from dept d, emp e
where d.deptno(+) = e.deptno
-------------------------------------------
| Id | Operation | Name | E-Rows |
-------------------------------------------
| 0 | SELECT STATEMENT | | |
|* 1 | TABLE ACCESS FULL| EMP | 7013 |
-------------------------------------------
11g부터는 PK와 FK 제약이 설정되어 있으면 아래와 같은 in 또는 서브쿼리도 일반 조인문 제거처럼 제거 된다.
select * from emp e
where deptno in (select /*+eliminate_join(dept)*/ deptno from dept);
select * from emp e
where exists
(select /*elimiate_join(dept)*/ 'x' from dept where deptno = e.deptno);