DROP TABLE T PURGE;
CREATE TABLE T AS SELECT * FROM ALL_OBJECTS;
CREATE INDEX T_OWNER_IDX ON T( OWNER ) ;
begin
dbms_stats.gather_table_stats( user, 'T', method_opt=> 'for all columns size 1' );
end;
/
ALTER SESSION SET "_OPTIMIZER_COST_MODEL" = io;
SET AUTOTRACE TRACEONLY EXP;
SQL> SELECT /*+ INDEX( T ) */ * FROM T WHERE OWNER = 'SYS';
Id | Operation | Name | Rows | Bytes | Cost |
0 | SELECT STATEMENT | 3139 | 297K | 91 | |||||||||
1 | TABLE ACCESS BY INDEX ROWID | T | 3139 | 297K | 91 | – 91 - 8 예상함 ( 클러스터링 팩터가 비용 계산식에 고려 됨 ) |
| INDEX RANGE SCAN | T_OWNER_IDX | 3139 | 8 | – 8 예상함 --- |
Predicate Information (identified by operation id):
2 - access("OWNER"='SYS')
Note
{CODE}
: HWN아래쪽 블록을 순차적으로 읽어 들이는 과정에서 발생하는 I/OCALL 횟수로 비용을 계산한다.
FULL SCAN할 때는 한번여 여러 BLOCK을 읽어들이는 Multiblock I/O방식을 사용 하므로 총 블럭수 / db_file_multiblock_read_count = I/O CALL이 발생을 하지만 내부적 조정된 값으로 비용을 계산 하기 때문에 차이가 발생 한다.
디스크 I/OCALL 횟수로 테이블 엑세스 비용을 평가 할경우
1. Single Block I/O와 Multiblock I/o 비용은 같다
2. 캐싱 효과를 전혀 고려 하지 않는다.
: 인덱스 탐색 비용을 조정 하고자 할때 사용
설정 범위값은 1~10,000
기본값이 100이란 수치는 한 번의 I/O CALL을 통해 Single Block Read 방식으로 한 블록을 읽는 비용과
Multiblock Read 방식으로 여러 블록을 읽는 비용을 같게 평가 하라는 의미
낮게 설정 할수록 옵티마이저는 테이블 스캔보다 인덱스를 이용한 테이블 엑세스를 선호
:NL 조인시 INNER 테이블 쪽을 매번 디스크에 읽는가정 하지만 이는 비현실적이므로
NL조인에서 inner쪽 인덱스 블록이 캐싱돼 있을 가능성을 옵티마이저에게 알려주는 파라미터이다.
값의 범위는 0~100이며 값이 높게 설정 할 수록 옵티마이저는 인덱스를 이용한NL 조인을 선호