h1.비용
h3.(1) I/O 비용 모델
h5.인덱스를 경유한 테이블 액세스 비용
-- 인텍스를 경유한 테이블 액세스 시 에는 Single Block 1/0 방식 이 사용
-- 디스크에서한 블록을 읽을 때 마다 한 번의 I/O Call을 일으키는 방식이므로 읽게 될 물리적 블록 개수가 액세스 비용 = I/O Call 횟쉬과 일치한다
create table t as select * from all_objects;
Table T이(가) 생성되었습니다.
create index t_owner_idx on t(owner) ;
Index T_OWNER_IDX이(가) 생성되었습니다.
begin
dbms_stats.gather_table_stats(user, 'T', method_opt=> ' for all columns size 1' );
end;
PL/SQL 프로시저가 성공적으로 완료되었습니다.
alter session set "_optimizer_cost_model" = io;
Session이(가) 변경되었습니다.
set autotrace traceonly explain;
Traceonly 옵션은 현재 지원되지 않습니다.
EXPLAIN PLAN FOR
select /* + index (t) */* from t where owner = 'SYS' ;
select * from table(dbms_xplan.display)
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1292 | 113K| 37 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1292 | 113K| 37 |
|* 2 | INDEX RANGE SCAN | T_OWNER_IDX | 1292 | | 4 |
---------------------------------------------------------------------------
==========================================================================================
index scan 단계에서 cost 4 발생
table access 단계에서 37 - 4(index scan) = 34 single block 발생
row가 1292인데 I/O call 이 34번인건 클러스트링 팩터가 비용계산식에 고려 되어있기때문
비용 = blevel + -- 인텍스 수직적 탐색 비용
(리프 블록 수 × 유효 인텍스 선택도) + -- 인텍스 수평적 탐색 비용
(클러스터링 팩터 × 유효 태이블 선택도) -- 테이블 Random 액세스 비용
* blevel : 브랜치 레벨을 의미하며
* 유효 인텍스 선택도 : 전체 인텍스 레코드 중에서 조건절을 만족하는 레코드를 찾기 위해 스캔할 것으로 예상되는 비율(%)
* 유효 테이블 선택도 : 전체 레묘드 중에서 인텍스 스캔을 완료하고서 최종적으로 테이블을 방문할 것으로 예상되는 비율(%)
select i.blevel , i.leaf_blocks, c .num_distinct, i.clustering_factor
, 1 + (i.leaf_blocks * 1 / c.num_distinct) "인텍스 스캔 비용"
, 1 + (i.leaf_blocks * 1 / c.num_distinct)
+ (i.clustering_factor * 1 / c.num_distinct) "총 테이블 액세스 비용"
from user_indexes i , user_tab_col_statistics c
where i.index_name = 'T_OWNER_IDX'
and c.table_name = i.table_name
and c.column_name = 'OWNER' ;
BLEVEL LEAF_BLOCKS NUM_DISTINCT CLUSTERING_FACTOR 인텍스 스캔 비용 총 테이블 액세스 비용
---------- ----------------------- ------------------------ ------------------------- ---------------------- ---------------------------------------
1 44 14 452 4.1428571428571 36.428571428571428571
h5.Full Scan에 의한 테이블 액세스 비용
-- 테이블을 Full Scan할 때는 HWM 아래쪽 블록을 순차적으로 읽어 들이는 과정에서 발생하는 I/O Call 횟수로 비용을 계산
-- Full Scan할 때는 한번의 I/O Call로써 여러 블록을 읽어 들이는 Multiblock I/O 방식을 사용
-- 총블럭수 / db_file_multiblock_read_count = I/O call <= 가 일치하진 않는다
select blocks from user_tables where table_name = 'T' ;
BLOCKS
----------
242
alter session set db_file_multiblock_read_count = 2; -- 멀티블록을 두개씩 읽어라
Session이(가) 변경되었습니다.
EXPLAIN PLAN FOR
select /*+ full(t) */ * from t where owner = 'SYS' ;
select * from table(dbms_xplan.display);
----------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------
| 0 | SELECT STATEMENT | | 1292 | 113K| 93 |
|* 1 | TABLE ACCESS FULL| T | 1292 | 113K| 93 |
----------------------------------------------------------
db_file_multiblock_read_count = 4
----------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------
| 0 | SELECT STATEMENT | | 1292 | 113K| 60 |
|* 1 | TABLE ACCESS FULL| T | 1292 | 113K| 60 |
----------------------------------------------------------
db_file_multiblock_read_count = 8
----------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------
| 0 | SELECT STATEMENT | | 1292 | 113K| 38 |
|* 1 | TABLE ACCESS FULL| T | 1292 | 113K| 38 |
----------------------------------------------------------
h5.I/O 비용 모델의 비현실적인 가정
디스크 I/O Call 횟수로써 테이블 액세스 비용을 평가 의미
위의 가정을 보정하는 오라클 파라미터
http://wiki.gurubee.net/pages/viewpage.action?pageId=1507599
h3.(2) CPU 비용 모델
블록 I/O가 소량인데도 쿼리 수행 시간이 상당히 오래 걸리는 경우
CPU 비용 모댈에서의 비용계산식
Cost = ( #SRds * sreadtim +
#MRds * mreadtim +
#CPUCycles / cpuspeed
) / sreadtim