부족한 옵티마이징 팩터 

 - 옵티마이저는 주어진 환경에서 최선을 다할 뿐 적절한 옵티마이징 팩터를 제공하는 것은 결국 

   사람의 몫 


부정화한 통계 

 - 샘플링 방식으로 통계를 수집할 때는 정확성 문제와 더불어 안정성 측면에도 관심을 기울여야 

    한다, 분포가 균등하지 않은 컬럼이라면 수집할 때마다 통계치가 바뀔 수 있어 실행계획을 

    불안정하게 만든다. 

 - 통계 수집 주기도 매우 중요하다. 


히스토그램의 한계 

 - 히스토그램 버킷 개수로 254개까지만 허용된다는 점도 옵티마이저에겐 주요한 제약사항이다. 


바인드 변수 사용 시 균등분포 가정 

 - 아무리 정확한 컬럼 히스토그램을 보유하더라도 바인드 변수를 사용한 SQL에는 무용지물이 

   되고 만다. 조건절에 바인드 변수를 사용하면 옵티마이저가 균등분포를 가정하고 

   비용을 계산하기 때문 


결합 선택도 산정의 어려움 

 - 조건절 컬럼이 서로 상관관계에 있으면 정확한 데이터 분포와 카디널리티를 산정하기 어려움 

 - 9i 부터는 동적 샘플링을 통해 이 문제를 해결하려고 시도, 소량의 데이터 샘플링을 통해 

    where 조건절에 사용된 두 개 이상 컬럼의 결합 분포를 구하는 기능으로, 동적 샘플링 레벨을 

    4 이상으로 설정할 때만 작동 

 - 11g부터는 사용자가 지정한 컬럼들에 대한 결합 선택도를 미리 수집해 두는 기능을 제공 


비현실적인 가정 

 - singleblock I/O 와 multiblock I/O 비용을 갖게 평가 

 - 캐싱 효과를 고려하지 않음 

 - 비용 평기시 디스크 I/O call 횟수만 더함

   * 옵티마이저는 메모리 자원에 대한 최악의 상황을 가정하고 비용을 산정하는 것인데, 

      이는 DW 환경에나 적합한 가정이다. 

 - 비현실적인 가정들을 보정할 수 있도록 오라클은 8i에서 아래 두 개의 파라미터를 제공 

     ● optimizer_index_caching 

     ● optimizer_index_cost_adj 


규칙에 의존하는 CBO 

 - 아무리 비용기반 옵티마이저라 하더라도 부분적으로는 규칙에 의존한다. 

 - 예를 들어, 원격 테이블이나 External 테이블에 대해서는 카디널리티, 평균 행 길이, 블록수 

   그리고 각종 인덱스 관련 통계항목들에 대해 고정된 상수 값을 사용한다. 

 - 9i 까지는 뷰 또는 서브쿼리를 만나면 무조건 쿼리 블록을 풀어 메인 쿼리와 Merging하려한다. 

 - 10g에서 대부분 쿼리 변환이 비용기반으로 개선 되었다. 


알파벳순 인덱스 선택 규칙 

 - CBO 에서, 두 대안 인덱스의 예상 비요이 같을 때 알파벳 순에서 앞선 것을 선택한다. 

 - 물리 데이터베이스 설계 단계에서 인덱스 명명 규칙을 정할 때 매우 중요한 시사점이다. 


하드웨어 성능 특성 

 - 오라클 9i부터 시스템 통계를 수집하는 기능이 도입되었다. 


동적 실시간 최적화 

 - 쿼리 최적화가 단일 SQL문 성능을 최적화하는 데 초점을 맞추는 반면, 동적 실시간 최적화는 

   수많은 SQL이 동시에 수행되는 환경에서 시스템 전체 최적화를 이루는 데 초점을 맞춘다. 

+ Recent posts