ORACLE INDEX FULL SCAN vs INDEX FAST FULL SCAN
from Oracle Scratchedpad | INDEX FULL SCAN
INDEX FAST FULL SCAN http://jonathanlewis.wordpress.com/2006/12/15/index-operations/
1.
INDEX
FULL SCAN vs INDEX FAST FULL SCAN
INDEX FAST FULL SCAN은 INDEX BLOCK 의
ACCESS 만으로 끝나는 경우 볼 수 있다.
INDEX FULL SCAN 의 경우 주로 hint 의 사용으로 볼 수 있는 경우가 많고
이 경우
정렬(sort) 이 필요하기에 사용한다.
2.
두
SCAN 의 차이
scott.emp 의 sal 에 not null 조건 생성 후 index를 생성하겠다.
SQL> alter table emp
modify (sal number not null);
Table altered.
SQL> create index
emp_sal_idx on emp(sal);
Index created.
SQL> select /*+
index_desc(emp emp_sal_idx) */
2
ename,sal from emp;
ENAME SAL
---------- ----------
KING 5000
FORD 3000
SCOTT 3000
JONES 2975
BLAKE 2850
CLARK 2450
ALLEN 1600
TURNER 1500
MILLER 1300
MARTIN 1250
WARD 1250
ADAMS 1100
JAMES 950
SMITH 800
14 rows selected.
Execution Plan
----------------------------------------------------------
0
SELECT STATEMENT Optimizer=CHOOSE (Cost=826 Card=82 Bytes=16
40)
1
0 TABLE ACCESS (BY INDEX ROWID)
OF 'EMP' (Cost=826 Card=82 B
ytes=1640)
2
1 INDEX
(FULL SCAN DESCENDING) OF 'EMP_SAL_IDX' (NON-UNIQU
E) (Cost=26 Card=82)
위 경우 INDEX
FULL SCAN 을 했고 정렬된 모습을 볼 수 있다. 기본적으로 인덱스는 특별히 NO SORT 옵션을 사용해 INDEX를 생성한게 아니면 SORT 된 상태이다.
다시말해 INDEX 힌트를
사용해 엑세스 해도 내림이든 올림이든 정렬된 상태의 값을 받을 것이다.
SQL> select
/*+index_ffs(emp emp_sal_idx)*/
2
count(*) from emp;
COUNT(*)
----------
14
Execution Plan
----------------------------------------------------------
0
SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=1)
1
0 SORT (AGGREGATE)
2
1 INDEX
(FAST FULL SCAN) OF 'EMP_SAL_IDX' (NON-UNIQUE) (Co
st=5 Card=82)
위의 예는 INDEX FULL SCAN 의 예이며 사전에 SAL 컬럼에 NOT NULL 조건을 주었다.
INDEX 블록에
포함되는 ROW는 NULL 을 제외하고 들어가기 때문에 인덱스
키로 사용되는 테이블컬럼에 NOT NULL 조건이 있어야 테이블, 인덱스
로우의 수가 동일함을 보장할 수 있다. 인덱스 엑세스만으로 연산이 끝나기에 FAST FULL SCAN을 했다.
/*+ 두 스캔의
차이에 대해 내용 추가 */