2014년 1월 19일 일요일

[oracle hint]ACCESS 경로를 변경힌트(NO_INDEX)[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

[oracle hint]ACCESS 경로를 변경힌트(NO_INDEX)[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

 
이 힌트의 인자로 주어진 인덱스를 사용하지 말라는 의미인데 인덱스를 인자로 안주고 테이블만 인자로 준다면 그 테이블에서 생성된 어떠한 인덱스도 사용하지 말라는 뜻입니다.
 
[형식]
 
 
[인덱스를 사용하는 경우]
SELECT 
       ename, sal
FROM   EMP
WHERE  ENAME LIKE 'S%';
 
--------------------------------------------------------------------
Operation            Object Name      Rows     Bytes    Cost     
------------------------------------------------------------------
SELECT STATEMENT Optimizer Mode=ALL_ROWS               2                        2
  TABLE ACCESS BY INDEX ROWID            SCOTT.EMP        2           18         2            
    INDEX <st1:placetype w:st="on">RANGE</st1:placetype> SCAN   SCOTT.IDX_EMP_ENAME 2                        1                                                     
 
[NO_INDEX를 사용하는 경우]
SELECT 
       ename, sal
FROM EMP
WHERE ENAME LIKE 'S%';
 
--------------------------------------------------------------------
Operation            Object Name      Rows     Bytes    Cost     
------------------------------------------------------------------
SELECT STATEMENT Optimizer Mode=ALL_ROWS             2             3
  TABLE ACCESS FULL SCOTT.EMP    2      18     3                                     
 
[]
SELECT  employee_id 
FROM employees 
WHERE employee_id > 200; 
 
 
 
[실습]
 
-      실습을 위한 예제 테이블 및 데이터는 아래 링크에서 확인 바랍니다.
 
myemp1 : 1000만건
myemp1_old : 100만건
mydept : 5
 
테스트환경 : oracle 11g
 
 
RBO(rule based optimizer)로 동작 시키면서 테스트 해 보자.
 
아래 실습에서 where절에 출현되는 deptno 0,1,2,3,4중 한 값으로 myemp1 1000만 건의 데이터 중 각 부서값의 분포도는 20% 정도 된다. 즉 각 부서별 200만건 정도 데이터가 존재한다. 그래서 일반 B*Tree 인덱스로 이용 하긴 좀 그렇다. 인덱스 태우면 오히려 더 느리다.
 
SQL> alter session set optimizer_mode = rule;
 
세션이 변경되었습니다.
 
n  실행계획만 보기 위해
SQL> set autotrace on explain
 
SQL> select count(ename)
  2   from  myemp1
  3  where deptno = 1;
 
COUNT(ENAME)
------------
     2000000
 
   : 00:00:16.98  -- 인덱스를 타니  시간이 많이 걸린다.
----------------------------------------------------------
| Id  | Operation                    | Name              |
----------------------------------------------------------
|   0 | SELECT STATEMENT             |                   |
|   1 |  SORT AGGREGATE              |                   |
|   2 |   TABLE ACCESS BY INDEX ROWID| MYEMP1            |
|*  3 |    INDEX RANGE SCAN          | IDX_MYEMP1_DEPTNO |
----------------------------------------------------------
 
 
이번에는 인덱스를 안 태우기 위해 no_index 힌트를 사용하자.
 
SQL> select  count(ename)
  2   from  myemp1
  3  where deptno = 1;
 
COUNT(ENAME)
------------
     2000000
 
   : 00:00:08.79
 
 
-----------------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     1 |    15 | 16966   (1)| 00:03:24 |
|   1 |  SORT AGGREGATE    |        |     1 |    15 |            |          |
|*  2 |   TABLE ACCESS FULL| MYEMP1 |  2000K|    28M| 16966   (1)| 00:03:24 |
-----------------------------------------------------------------------------
 
 
 
 
n  아래는 myemp1 테이블의 어떠한 인덱스도 사용하지 말라는 의미
SQL> select  count(ename)
  2   from  myemp1
  3  where deptno = 1;
 
COUNT(ENAME)
------------
     2000000
 
   : 00:00:08.84
 
-----------------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     1 |    15 | 16966   (1)| 00:03:24 |
|   1 |  SORT AGGREGATE    |        |     1 |    15 |            |          |
|*  2 |   TABLE ACCESS FULL| MYEMP1 |  2000K|    28M| 16966   (1)| 00:03:24 |
-----------------------------------------------------------------------------
 
 


  • 자바
  • 오라클/빅데이터
  • 아이폰/안드로이드
  • 닷넷/WPF
  • 표준웹/HTML5
  • 채용/취업무료교육
  • 초보자코스

  • 댓글 없음:

    댓글 쓰기