오라클 성능 고도화 원리와 해법 II (2010년)
조건절 이행 0 0 3,214

by 구루비 쿼리변환 조건절이행 [2010.05.14]


조건절 이행

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

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

문서에 대하여

"코어 오라클 데이터베이스 스터디모임" 에서 2010년에 "오라클 성능 고도화 원리와 해법 II " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3229

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입