이 힌트의 인자로 주어진 인덱스를 사용하지 말라는 의미인데 인덱스를 인자로 안주고 테이블만 인자로 준다면 그 테이블에서 생성된 어떠한 인덱스도 사용하지 말라는 뜻입니다.
[형식]
[인덱스를 사용하는 경우]
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 |
-----------------------------------------------------------------------------
댓글 없음:
댓글 쓰기