반응형

/********************************************************************************************
-- 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

SQL> select *
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
위와 같이 옵티마이저가 실행계획을 세우려는데 A와 B의 두가지 방법이 나왔다. A는 풀테이블스캔, B는 인덱스스캔이라고 할 때 어느 것이 더 효율적일까? 물론 A가 더 효율적이다.
효율적인 실행계획이란 I/O를 최대한 적게 일으키는 것이 가장 우선순위이기 때문이다.


● CBO에서만 사용 가능한 기능들
- 테이블 및 인덱스의 파티셔닝
- IOT
- Reverse key 인덱스
- FBI
- Select 문장에서의 SAMPLE절
- 병렬쿼리 및 병렬DML
- Star join 및 Star 변형
- 옵티마이저 확장
- Mview를 이용한 Query rewrite
- Enterprise Manager progress meter
- Hash join
- 비트맵인덱스 및 비트맵조인인덱스
- 인덱스 skip scan 알고리즘
반응형

+ Recent posts