처음 질문 올립니다.
create table hw04 (sorted int, random int, c varchar2(60));
BEGIN
FOR i IN 1..2550 LOOP
INSERT INTO hw04 (sorted, random, c) values (i,
round(dbms_random.value*2550), rpad('X', 6, 'X'));
END LOOP;
END;
이러한 명령으로 테이블을 만들었습니다.
보시다시피 sorted는 2550까지 순차적으로 값을 넣구요
random은 2550의 범위의 수 안에서 랜덤하게 값을 넣습니다.
그런 다음 두 column에 인덱스를 생성해주고 statistic 분석을 마친
다음
다음 두 종류의 쿼리를 날렸습니다.
set autot trace
<sorted 컬럼에 대한 쿼리를 날렸을 때와 그 실행 계획>
SELECT sorted, random
FROM hw04
WHERE sorted = MOD(2000312550, 100);
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=6)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'HW04' (TABLE) (Cost=2
Ca
rd=1 Bytes=6)
2 1 INDEX (RANGE SCAN) OF 'HW04_IDX_SORTED' (INDEX)
(Cost=1
Card=1)
<random 컬럼에 대한 쿼리를 날렸을 때와 그 실행 계획>
SELECT sorted, random
FROM hw04
WHERE random = MOD(2000312550, 100);
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=2
Bytes=12)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'HW04' (TABLE) (Cost=3
Ca
rd=2 Bytes=12)
2 1 INDEX (RANGE SCAN) OF 'HW04_IDX_RANDOM' (INDEX)
(Cost=1
Card=2)
sorted 컬럼의 경우 그 비용이 leaf(1)+blocks(1)=2인 것은 이해가
되는데
random 컬럼에서 왜 오차 1이 발생하였는지 모르겠군요.
아시는 분은 설명 부탁드립니다.
|