Computer_IT/DBMS 2006.08.07 19:17

CBO

SQL> alter session set optimizer_mode=rule;

Session altered.

SQL> set autotrace traceonly explain
SQL> select * from employees where department_id=40;

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=RULE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES'
2 1 INDEX (RANGE SCAN) OF 'EMP_DEPARTMENT_IX' (NON-UNIQUE)



SQL> set autotrace off
SQL> alter session set optimizer_mode=all_rows;

Session altered.

SQL> set autotrace traceonly explain
SQL> select * from employees where department_id=40;

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=3 Bytes=183)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES' (Cost=2 Card=3 Bytes=183)

2 1 INDEX (RANGE SCAN) OF 'EMP_DEPARTMENT_IX' (NON-UNIQUE) (Cost=1 Card=3)



CBO는 table에 통계정보..
Oracle 은 통계정보 만을 가지고 실행 정보를 작성하기 때문에
통계정보가 잘못되었ㅤ 경우에는 잘못된 실행정보를 생성한다.

몇달전에 Employees 행수가 얼마 많지 않은 상태에서 실행 계획을 작성한것을...
10배정도 데이터가 많아진 상태에서도 이전의 실행계획을 사용한것은 잘못되었음...
그러 경우다시 실행계획을 작성한것으로 적용하여야함...

'Computer_IT > DBMS' 카테고리의 다른 글

[Oracle] Cluster 구성  (0) 2006.11.01
[ORACLE] Oracle9i 실행계획 보기  (0) 2006.09.18
ORACLE USER KILL  (0) 2006.09.18
CBO  (0) 2006.08.07
Oracle® Database SQL Reference  (0) 2006.08.07
[MySQL] 사용자 추가  (0) 2006.07.09
posted by 고급코드 고급코드