쿼리 튜닝시 가끔 오라클이 똑똑하다고 느낄때가 있다
오늘은 그중에서 Query Transformation 이 되는 경우를 소개한다.
아래의 스크립트를 보자.
from emp a,
(select deptno, dname
from dept
where deptno = :v_deptno) b
where a.deptno = b.deptno;
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 205 | 4715 | 4 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 205 | 4715 | 4 (0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 13 | 1 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL | EMP | 205 | 2050 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
위스크립트를 보면 select 절에 b.dname 을 사용한다.
하지만 아래를 스크립트를 보면 인라인뷰 내에서는 dname 을 select 하지만 최종 select 절에서
b.dname 을 빼고 실행한 결과이다.
물론 아래상태에서 VIEW MERGE 가 진행 될것이다.
from emp a,
(select deptno, dname
from dept
where deptno = :v_deptno) b
where a.deptno = b.deptno;
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 205 | 2665 | 3 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 205 | 2665 | 3 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN| PK_DEPT | 1 | 3 | 0 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| EMP | 205 | 2050 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------
위 plan 을 보면 dept 에 rowid 로 테이블 엑세스 하는 operation 이 사라졌다.
신기하지 않은가?
오라클이 알아서 최종 select list 에서 d.dname 제거 한것을 알아채고 Query Transformation 을 하여
인덱스만 access 한것이다.
즉 아래의 스크립트 처럼 옵티마이져가 쿼리를 수정한것이다.
from emp a,
(select deptno
from dept
where deptno = :v_deptno) b
where a.deptno = b.deptno;
물론 옵티마이져가 사람이라면 아예 인라인뷰 b 를 빼고 아래처럼 재작성 할것이다.
아래처럼 해도 결과는 똑같기 때문이다.
from emp a
where a.deptno = :v_deptno;
'Oracle > Optimizer' 카테고리의 다른 글
오라클에 트랜스포머가 있다? (4) | 2009.04.15 |
---|---|
Access Sub Query 의 함정 (4) | 2008.11.19 |
Using Sub query Method( Filter / Access sub Query ) (9) | 2008.09.29 |
Using Sub query Method (Sub query Flattening ) (10) | 2008.09.09 |
히든 파라미터 설정변경의 위험성 (0) | 2008.06.23 |