본문 바로가기

ORACLE

ORACLE FULL SCAN vs INDEX FAST FULL SCAN v1.0

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을 했다.

 

/*+ 두 스캔의 차이에 대해 내용 추가 */