Oracle Tuning 강좌
뷰 안에 Local Hint가 들어있는 경우 0 1 99,999+

by 강정식 DBMS_XPLAN.DISPLAY DBMS_XPLAN Local Hint [2010.06.09]


튜닝 전

  다섯 번째 예제는 View 또는 인라인 뷰 안에 Local Hint가 존재하여 성능이 나빠지는 사례이다.

  세 번째 사례에서도 살펴보았듯이 Local Hint가 존재할 경우 해당 블록의 우선순위가 가장 높게 되어 인라인 뷰 밖에서 조건을 넣게 되도 인덱스를 사용할 수 없다.

  이번 사례 또한 인라인 뷰 밖에서 EMPNO 조건을 넣었음에도 불구하고 인라인 뷰 안에 TABLE FULL SCAN을 하도록 힌트 /*+ FULL(EMP) */가 들어가 있어 Unique 인덱스인 EMP_U1을 사용할 수 없게 된 것이다.

 
SQL> EXPLAIN PLAN FOR
     SELECT *
     FROM  (SELECT /*+ FULL(EMP) */
                    EMPNO, JOB, HIREDATE, DEPTNO
            FROM   EMP) EMP_V
     WHERE  EMP_V.EMPNO = :B1         

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    18 |  9343   (4)| 00:01:53 |
|*  1 |  TABLE ACCESS FULL| EMP  |     1 |    18 |  9343   (4)| 00:01:53 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("EMPNO"=TO_NUMBER(:B1))
    

튜닝 후

  그러므로 반드시 공용 View 일 경우에는 Local Hint가 들어가지 말도록 해야 하며, 이 경우에도 Local Hint만 제거할 경우 EMPNO 조건이 인라인 뷰 안으로 잘 들어가는 것을 확인할 수 있다.

 
SQL> EXPLAIN PLAN FOR
     SELECT *
     FROM   (SELECT EMPNO, JOB, HIREDATE,  DEPTNO
             FROM   EMP) EMP_V
     WHERE  EMP_V.EMPNO = :B1 ;

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

--------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |     1 |    18 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |     1 |    18 |     3   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | EMP_U1 |     1 |       |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("EMPNO"=TO_NUMBER(:B1))
    

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

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

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

by 참된신자 [2014.08.13 12:05:15]

감사합니다 :)

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