/********************************************************************************************
-- Title : [10g] CBO vs. RBO
-- Reference : sksstar.tistory.com
-- Key word : CBO RBO statistics 통계 cost based optimizer rule based optimizer 옵티마이저
********************************************************************************************/
-- CBO 통계 수집
■ RBO
○ 미리 정해진 규칙에 의한 실행계획 결정
- 연산자 우선순위
- 접근 경로의 우선순위
- SQL문장의 syntax 규칙
=> RBO는 융통성이 없음.
○ 데이터에 대한 통계 내지 실제 SQL을 수행할 경우에 소요될 비용에 대한 고려를 하지 않음.
- 인덱스를 쓰려면 내가 찾고자 하는 데이터가 대략 5% 이내라면 써도 되나 꼭 모든 경우에 그런 것은 아니다. 테이블에 총 데이터 건수가 굉장히 많다면 5% 이내라 해도 풀테이블스캔이 더 효율적일 수 있다. 하지만 RBO는 무조건 인덱스가 있으면 인덱스를 타버려 인덱스의 효율이 없음.
○ RBO는 오라클6버전 이하와의 역호환성을 위해 지원
● RBO 순위 결정 방식
순위 | 접근경로 |
1 | Single row by ROWID |
2 | Single row by cluster join |
3 | Single row by hash cluster key with unique or primary key |
4 | Single row by unique or primary key |
5 | Cluster join |
6 | Hash cluster key |
7 | Indexed cluster key |
8 | Composite index |
9 | Single-column index |
10 | Bounded range search on indexed columns |
11 | Unbounded range search on indexed columns |
12 | Sort-merge join |
13 | MAX or MIN of indexed column |
14 | ORDER BY on indexed column |
15 | Full table scan |
from emp
where empno=7900;
위 쿼리를 RBO를 이용하여 실행계획을 세워보면, 맨처음 15번 규칙부터 위로 가면서 계속 대입해보는데, 여기서는 15번과 9번이 부합되는 것으로 확인되었다. 번호가 작은 것이 더 빠른 방식이므로 옵티마이저는 9번 규칙을 적용하여 실행계획을 세워준다.
■ CBO
○ 데이터에 대한 각종 통계를 사용
○ 실제 SQL을 수행할 때 소요될 비용을 예측하고 그 값을 기준으로 실행계획 결정
- I/O 횟수
- CPU 사용량
- 메모리 사용량
- 네트워크 전송량
=> 무조건 정해진 규칙에 의해 판단하는 RBO에 비해 보다 현실적이고 지능적인 판단 가능.
○ 오라클7버전에 처음 도입. 11gR2부터는 RBO는 없어지고 CBO만 쓰임.
A | B | |
한번에 끌어올릴 수 있는 Block 갯수 | 100 | 10 |
I/O 횟수 | 5 | 10 |
효율적인 실행계획이란 I/O를 최대한 적게 일으키는 것이 가장 우선순위이기 때문이다.
● CBO에서만 사용 가능한 기능들
- 테이블 및 인덱스의 파티셔닝
- IOT
- Reverse key 인덱스
- FBI
- Select 문장에서의 SAMPLE절
- 병렬쿼리 및 병렬DML
- Star join 및 Star 변형
- 옵티마이저 확장
- Mview를 이용한 Query rewrite
- Enterprise Manager progress meter
- Hash join
- 비트맵인덱스 및 비트맵조인인덱스
- 인덱스 skip scan 알고리즘