옵티마이져가 연역법(A=B고 B=C이면 A=C와 같다)을 통한 추론을 통해 새로운 조건절을 내부적으로 생성해주는 쿼리변환이다.
===============================================================
Id 5번에 해당하는 Predicate정보를 보면 Dept테의블의 조건("D"."DEPTNO"=10)이 조인조건을 따라 EMP테이블을 대상으로 같은 조건("E"."DEPTNO"=10)으로 액세스되는 것을 확인할 수 있다.
orcl:WOONG >
1 select * from dept d, emp e
2 where e.job = 'MANAGER'
3 and e.deptno = 10
4 and d.deptno = e.deptno;
경 과: 00:00:00.00
Execution Plan
----------------------------------------------------------
Plan hash value: 319365596
----------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |
----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 57 |
| 1 | NESTED LOOPS | | 1 | 57 |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 |
|* 3 | INDEX UNIQUE SCAN | DEPT_PK | 1 | |
| 4 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 37 |
|* 5 | INDEX RANGE SCAN | EMP_IDX | 2 | |
----------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("D"."DEPTNO"=10)
5 - access("E"."DEPTNO"=10 AND "E"."JOB"='MANAGER')
위의 쿼리는 조건절 이행이라는 쿼리변환에 의해 아래처럼 내부적으로 쿼리변환이 발생한다.
이렇게 각각 집합에 대한 조건이 들어가게 되었을 경우의 장/단점은?
orcl:WOONG >
1 select * from dept d, emp e
2 where e.job = 'MANAGER'
3 and e.deptno = 10
4 and d.deptno = 10;
경 과: 00:00:00.00
Execution Plan
----------------------------------------------------------
Plan hash value: 319365596
----------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |
----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 57 |
| 1 | NESTED LOOPS | | 1 | 57 |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 |
|* 3 | INDEX UNIQUE SCAN | DEPT_PK | 1 | |
| 4 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 37 |
|* 5 | INDEX RANGE SCAN | EMP_IDX | 2 | |
----------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("D"."DEPTNO"=10)
5 - access("E"."DEPTNO"=10 AND "E"."JOB"='MANAGER')
조건절이행에 의해서 조인조건이 사라지고 이로 인해 비효율적인 실행계획을 선택한다면 사용자가 명시적으로 조건을 추가하거나 조인문를 가공하는 방법이 있다.
orcl:WOONG >
1 select * from dept d, emp e
2 where e.job = 'MANAGER'
3 and e.deptno = 10
4 and d.deptno = e.deptno
5 and d.deptno = 10 ;
경 과: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 319365596
----------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |
----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 57 |
| 1 | NESTED LOOPS | | 1 | 57 |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 |
|* 3 | INDEX UNIQUE SCAN | DEPT_PK | 1 | |
| 4 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 37 |
|* 5 | INDEX RANGE SCAN | EMP_IDX | 1 | |
----------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("D"."DEPTNO"=10)
5 - access("D"."DEPTNO"="E"."DEPTNO" AND "E"."JOB"='MANAGER')
filter("E"."DEPTNO"=10)
===============================================================