Histogram을 둘러싼 오해
실행 계획의 변화
- Histogram이 실행계획에 뜻하지 않은 변화를 준다.
- Bind Peeking: Histogram이 존재하는 경우에는 최초에 어떤 값이 Bind변수에 사용되느냐에 따라 실행계획이 결정된다. 또한 Hard Parse가 이루어질 때, 어떤 값이 주어졌느냐에 따라 실행계획이 매번 변할 수 있다. 이런 이유로 많은 System에서 Bind Peeking을 비활성화한다.(_OPTIM_PEEK_USER_BINDS를 FALSE로 변경)
- Density의 변화: Height-Balanced Histogram의 경우에는 Non Popular Value나 Bind변수로 이루어진 Predicate에 대해 Density를 사용한다. Density의 변화는 Selectivity의 변화를 초래하고, Cardinality의 변화를 초래한다.
- Join Cardinality의 변화: where절에 Join Predicate를 제외한 아무런 조건이 없는 경우에도 실행계획이 바뀔수 있다.(p.367)
Distinct Count
Histogram은 Distinct Count가 낮은 Column에 대해서만 유용한것 아닌가?
- Distinct Count는 Histogram과 전혀 무관하며, Histogram의 존재의 의의는 Data의 Skewness에 의해서만 결정된다.
Index Scan vs. Table Full Scan
Index가 없는 Column에 대해 Histogram이 도대체 왜 필요한가?
- Histogram의 존재의 목적은 Cardinality의 정확성을 높이는 것이다. Index를 경유하느냐 Table Full Scan을 하느냐는 Cardinality에 결정되는 결과일 뿐 목적이 아니다.
Histogram은 전지 전능한가?
- Histogram은 Bucket내에 존재하지 않는 값에 대한 Cardinality는 부정확하다.
- Bind변수를 사용하면서 Bind Peeking을 비활성화 한경우에도 부정확하다.
- Height-Balanced Histogram의 경우에는 특정 값이 Popular Value로 분류되는냐, Non Popular Value로 분류되느냐에 따라 Cardinality에서 큰 차이가 날 수 있다.
=> Histogram은 많은 장점을 제공하나 많은 한계점도 존재하므로, 한계점을 명확히 인지하고 사용해야한다.
문서에 대하여
- 최초작성자 : 오정희
- 최초작성일 : 2009년 4월 18일
- 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
- {*}이 문서의 내용은 조동욱님의 'Optimizing Oracle Optimizer'를 참고하였습니다.*