h2.Index Fast Full Scan
INDEX FAST FULL SCAN
INDEX FAST FULL SCAN은 TABLE FULL SCAN의 INDEX VERSION이라고 할 수 있다.
1) 인덱스 트리 구조를 무시하고 인덱스 세그먼트 전체를 multiblock read 방식으로 스캔
2) 인덱스가 파티션 돼 있지 않더라도 병렬 쿼리 가능
3) 인덱스 리프 노드가 갖는 연결 리스트 구조를 이용하지 않기 때문에 얻어진 결과집합이 인덱스 키 순서대로 정렬되지 않음
h5.Index Fast Full Scan vs Index Full Scan
위의 그림에서 알수있는거처럼 Index Fast Full 은 MultiBlock I/O를 사용한다는것이 한다는걸 알수있다..
h5.Parallel Index Fast Full Scan
Index Fast Full Scan의 큰장점중 하나는 Parallel Execution 이 가능하다는거다.
-- 테이블생성
SQL> create table t1(c1 int,c2 int)
2 partition by hash(c1)
3 partitions 4;
-- 인덱스생성
SQL> create index t1_n1 on t1(c1)
2 local;
-- 데이터생성
SQL> insert into t1
2 select level, level
3 from dual
4 connect by level <= 10000;
-- 통계정보수집
SQL> exec dbms_stats.gather_table_stats('bshman','t1',method_opt=>'for all columns size 1',cascade=>true);
-- 플랜
SQL> explain plan for
2 select /*+ index_ffs(t1) */
3 c1
4 from t1
5 where c1 >0;
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |Pstart| Pstop |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 40000 | 6 (0)| 00:00:01 | | |
| 1 | PARTITION HASH ALL | | 10000 | 40000 | 6 (0)| 00:00:01 | 1 | 4 |
|* 2 | INDEX FAST FULL SCAN| T1_N1 | 10000 | 40000 | 6 (0)| 00:00:01 | 1 | 4 |
----------------------------------------------------------------------------------------------
Parallel Hint를 부여하면?
-- 플랜
SQL> explain plan for
2 select /*+ index_ffs(t1) parallel(t1) */
3 c1
4 from t1
5 where c1 > 0;
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |Pstart| Pstop |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 40000 | 6 (0)| 00:00:01 | | |
| 1 | PARTITION HASH ALL | | 10000 | 40000 | 6 (0)| 00:00:01 | 1 | 4 |
|* 2 | INDEX FAST FULL SCAN| T1_N1 | 10000 | 40000 | 6 (0)| 00:00:01 | 1 | 4 |
----------------------------------------------------------------------------------------------
Parallel Hint를 주었음에도 불구하고 Parallel execution 이 선택되지않는다
이유는 Parallel Hint는 Table에서만 적용되기 때문이다.
Parallel Hint 를 사용하기위해서는 아래와 같이 Index Object에 Parallel 속성을 부여하거나
Parallel_Index Hint를 사용한다.
-- 인덱스변경
SQL> alter index t1_n1 parallel;
-- 플랜
SQL> explain plan for
2 select /* index_ffs(t1) */
3 c1 from t1
4 where c1 > 0;
또는
SQL> explain plan for
2 select /*+ index_ffs(t1) parallel_index(t1 t1_n1) */
3 c1 from t1 where c1 > 0;
---------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | TQ |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 40000 | 6 (0)| 00:00:01 | | | | | |
| 1 | PX COORDINATOR | | | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 10000 | 40000 | 6 (0)| 00:00:01 | | | Q1,00 | P->S | QC (RAND) |
| 3 | PX BLOCK ITERATOR | | 10000 | 40000 | 6 (0)| 00:00:01 | 1 | 4 | Q1,00 | PCWC | |
|* 4 | INDEX FAST FULL SCAN| T1_N1 | 10000 | 40000 | 6 (0)| 00:00:01 | 1 | 4 | Q1,00 | PCWP | |
--------------------------------------------------------------------------------------------------------------------------------
h5.Hints And Parameters
Index Fast Full Scan은 Index_FFS Hint를 이용해 제어한다
사용법은 아래와같다.
select /* index_ffs(t1) */ c1 from t1;
select /* index_ffs(t1 t1_n1) */ c1 from t1;
select /* index_ffs(t1 t1(c1)) */ c1 from t1;
Index Fast Full Scan 의 동작여부는 Fast_Full_Scan_Enabled parameter를 이용하여 제어할수있다.