구로디지털 오엔제이프로그래밍실무교육센터
이 힌트의 의미는 인덱스를 FAST FULL SCAN하라는 것인데, 보통 인덱스에 대한 스캔은 단일 블록 스캔인데 반해 인덱스 패스트 풀 스캔은 Multi Block Scan 입니다. 이왕 데이터를 읽을 때 하나씩 블록을 읽는 것보다 당연히 여러 개의 블록을 읽는다면 수행속도가 빨라질 것입니다.
물론 이 힌트가 동작하기 위해서는 SELECT절에 나타나는 컬럼 들이 INDEX_FFS의 인자로 사용된 인덱스의 컬럼 이어야 합니다. 예를 들어 index_ffs의 인자로idx_emp_ename(EMP 테이블의 ename 컬럼에 대한 인덱스) 이 주어졌다면 SELECT절에 나열되는 컬럼이 ename 이여야 한다는 것이죠...
[형식]
SELECT ename
FROM EMP
WHERE ENAME LIKE 'S%';
------------------------------------------------------------------
Operation Object Name Rows Bytes Cost SELECT STATEMENT
------------------------------------------------------------------Optimizer Mode=ALL_ROWS 2 2
INDEX FAST FULL SCAN SCOTT.IDX_EMP_ENAME 2 12 2
[예]
SELECT COUNT(*)
FROM order_items l, orders o
WHERE l.order_id > 50
AND l.order_id = o.order_id;
물론 위와 같은 경우 뿐 아니라 데이터의 개수를 헤아리는 COUNT(*)를 사용할 때도 INDEX_FFS를 사용하면 많은 시간을 단축할 수 있으니 이 부분은 Oracle Tip에 있는 COUNT(*)를 빠르게… 부분을 참고 하세요
[실습]
- 실습을 위한 예제 테이블 및 데이터는 아래 링크에서 확인 바랍니다.
myemp1 : 1000만건
myemp1_old : 100만건
mydept : 5건
테스트환경 : oracle 11g
아래 예제에서 실제 myemp1의 ename으로 인덱스를 걸어서 count(ename)을 해보도록 하겠다.
SQL> create index idx_myemp1_ename on myemp1(ename);
인덱스가 생성되었습니다.
n 인덱스를 사용 못하도록 숨기자.
SQL> alter index idx_myemp1_ename invisible;
인덱스가 변경되었습니다.
n 인덱스를 사용하지 않고 ename count를 하니 8초가 넘게 걸린다.
SQL> select count(ename) from myemp1;
COUNT(ENAME)
------------
10000000
경 과: 00:00:08.79
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 16931 (1)| 00:03:24 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
| 2 | TABLE ACCESS FULL| MYEMP1 | 10M| 123M| 16931 (1)| 00:03:24 |
-----------------------------------------------------------------------------
n 옵티마이저가 인덱스를 사용하도록 변경
SQL> alter index idx_myemp1_ename visible;
인덱스가 변경되었습니다.
n 인덱스를 보이도록 하니 CBO로 동작하여 오라클이 인덱스 패스트 스캔을 한다.
SQL> select count(ename) from myemp1;
COUNT(ENAME)
------------
10000000
경 과: 00:00:04.85
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 9478 (1)| 00:01:54 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
| 2 | INDEX FAST FULL SCAN| IDX_MYEMP1_ENAME | 10M| 123M| 9478 (1)| 00:01:54 |
------------------------------------------------------------------------------------------
n 이번에는 index_ffs 힌트 구문을 사용해 보자.
SQL> select count(ename) from myemp1;
COUNT(ENAME)
------------
10000000
경 과: 00:00:04.87
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 9478 (1)| 00:01:54 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
| 2 | INDEX FAST FULL SCAN| IDX_MYEMP1_ENAME | 10M| 123M| 9478 (1)| 00:01:54 |
------------------------------------------------------------------------------------------
댓글 없음:
댓글 쓰기