RBO를 사용하고 있습니다.
같은 쿼리를 돌렸는데 플랜이 계속 바뀝니다.
이게 상식적으로 말이 되나요? -.-
rbo 가 아닌것 같네요.
dba_tables 의 last_analyzed 컬럼이 null 인지 살펴보시고..
또한 해당 테이블에 통계정보가 없다 하더라도 병렬도 값이 디폴트 값인 1 아닌 그 이상의 값으로 되어 있으면 cbo로 작동합니다.
8i부터는 거의 CBO에서만 돌아가는 기능들이 대거 추가 되고 있습니다.
(플랜에서 Cost부분이 나오면 CBO임)
- Rule을 제외한 모든 힌트를 사용할 경우 자동으로 Optimizer mode는 CBO가 됩니다.
- 병렬쿼리도 역시 CBO에서 돌아갑니다.
- 파티션 테이블일 경우도 해당 테이블을 엑세스할 경우 CBO가 됩니다.
- Function Based-Index의 경우도 CBO에서 작동합니다.
위의 사례 말고도 CBO에 의존적인 기능이 대부분이라고 보시면 됩니다. 까딱하면 CBO로 흘러버립니다. 주의하셔야 하는 부분이죠.
그리고 RBO는 거의 개발이 중지 상태라고 보시면 됩니다.
병렬로 돌린 거 맞습니다.
그럼 얘는 어떤 통계 정보를 갖구 CBO로 작동하는 건가요?
오.. 신기하군요
analyze 를 돌려주지 않으셨기 때문에 오브젝트의 기본 정보들을 가지고 옵티마이져가 추정을 합니다. 당연히 정확도가 analyze를 돌렸던 것보다 상당히 떨어집니다.
RBO는 수동카메라라고 생각하셔야 합니다. 일일이 SQL을 Hint등으로 튜닝해주야 할겁니다. 노력이 많이 들어갑니다. 대신 항상 일정한 실행계획이 나오므로 예측가능하다는건 장점이 될 수 있습니다.
어쨌든 싫든 좋든 앞으론 CBO를 쓰셔야만 합니다. 격리된 테스트 환경에서 analyze를 돌려서 CBO 테스트를 해보시고 단계적으로 전환해나실 것을 추천드립니다.
(analyze 명령어보다는 dbms_stats 패키지를 통해서 통계정보를 만드시는 것을 추천드립니다.)