부족한 옵티마이징 팩터
- 옵티마이저는 주어진 환경에서 최선을 다할 뿐 적절한 옵티마이징 팩터를 제공하는 것은 결국
사람의 몫
부정화한 통계
- 샘플링 방식으로 통계를 수집할 때는 정확성 문제와 더불어 안정성 측면에도 관심을 기울여야
한다, 분포가 균등하지 않은 컬럼이라면 수집할 때마다 통계치가 바뀔 수 있어 실행계획을
불안정하게 만든다.
- 통계 수집 주기도 매우 중요하다.
히스토그램의 한계
- 히스토그램 버킷 개수로 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이 동시에 수행되는 환경에서 시스템 전체 최적화를 이루는 데 초점을 맞춘다.
'ORACLE > SQLP' 카테고리의 다른 글
성능고도화 3-5. 카디널리티 (0) | 2016.12.26 |
---|---|
성능고도화 3-4. 통계정보1 (0) | 2016.12.26 |
성능고도화 3-2 옵티마이저 행동에 영향을 미치는 요소 (0) | 2016.12.26 |
성능고도화 3-1. 옵티마이저 (0) | 2016.12.26 |
성능도고화 2-8. 고급 조인 테크닉 (0) | 2016.12.26 |