조건절 이행

옵티마이져가 연역법(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)

===============================================================

문서에 대하여