CBO와 RBO

CBO(Cost Based Optimizer)방식은 비용 기반 옵티마이저이고, RBO(Rule Based Optimizer) 방식은 규칙 기반 옵티마이저이다. 오라클 11g 부터는 RBO에 대한 기술 지원이 종료되었다.

RBO는 규칙 기반 옵티마이저로 미리 정해진 우선 순위 규칙에 따라 접근 경로(Access Path)를 결정한다. 순위가 높은 규칙이 낮은 규칙보다 우선 적용된다. 잘못된 우선 순위의 규칙이 적용되더라도 예측이 가능하며 안정적으로 실행계획의 제어가 쉽다.

CBO 방식은 통계정보에 따른 비용을 계산해 가장 최소한의 비용이 소모되는 접근 경로를 결정한다. 여기엔 I/O 뿐만 아니라 CPU 연산 비용 및 메모리 비용까지 포함한다.

여기서 비용은 논리적 비용을 말한다. 논리적 비용이란 어떻게 산출됐는지 구체적으로 알 수 없다거나 어떻게 산출됐는지 공개할 수 없다는 말과 같다. 그것은 오라클 옵티마이저의 핵심 기술에 대한 정보 보호 차원일 수도 있고, 간혹 발생하는 옵티마이저의 엉뚱한 실행계획에 대한 부끄러운 방어 차원일 수도 있다.

CBO는 통계정보가 잘못됐거나 최신 정보를 제대로 반영하지 못한다면 잘못된 접근 경로를 선택할 것이다. 이는 예측 불가능하고 실행계획의 제어가 어렵게된다. 간혹 잘못된 실행계획을 제공하는 경우도 있다. 그럼에도 CBO가 사용되는 이유는 RBO가 대안이 될 수 없기 때문이다.

RBO CBO
규칙 기준 최적화(15개 규칙) 비용 기준 최적화
SQL 실행 순서 규칙 우선순위 통계정보를 이용한 비용 우선순위
개발자의 능력과 의지에 좌우 옵티마이저 알고리즘 성능이 좌우
능숙한 쿼리 전문가에게 유리 평균적인 쿼리 품질 보장
오라클 11g부터 기술 미지원 오라클 7i부터 지원 시작

CBO 방식: 옵티마이저와 통계정보, 실행계획

옵티마이저는 사람의 두뇌와 같은 역할을 한다. 옵티마이저는 주어진 환경(통계정보, sql) 하에서 최적의 실행계획(Plan)을 우리에게 제공한다. 그렇다고 항상 최적의 실행계획을 제공하지 않기 때문에 우리는 힌트절을 통해 잘못된 실행계획을 바로 잡을 수 있다.

잘못된 SQL문이나 부정확한 통계정보에 따라 옵티마이저는 부실한 실행계획을 제공할 수 있다. 그러나 이러한 경우에도 원일을 추적해보면 우리의 잘못일 경우가 대부분이다. 옵티마이저가 올바른 판단을 하도록 다음과 같은 부분을 올바르게 제공하거나 제어해야한다.

  • 최적의 인덱스 구성하기
  • 올바른 SQL문 작성하기
  • 주기적으로 최신의 통계정보로 갱신하기
  • 힌트절을 추가해 옵티마이저 제어하기