오라클/Tuning

Histogram 이란?

빵순이^^ 2010. 8. 20. 16:39

Histogram 이란 Table 형태의 빈도(개수)를 Graphical 하게 표현한 것이다.

Skewed(빈도가 특정 값에 편향되어있는 것) 한 컬럼과 관련된 히스토그램이 없을 경우 CBO는 selectivity 계산에서 오류를 범하게 된다. 그것은 곧바로 cardinality 계산의 오류로 이어지고, 잘못된 실행계획을 선택하는 결과로 나타난다. 이런경우에 Histogram을 활용하면 보다 정확한 optimizer의 판단을 유도할 수 있다.


히스토그램 생성

1) 모든 column에 대해서 Histogram을 수집하지 않는다.

 exec dbms_stats.gather_table_stats(user, 't1', method_opt=>'for all columns size 1');


2) Oracle이 Data 분포를 고려하여 Bucket Size를 계산한다. Auto를 사용하면 Column이 Predicate로 사용된 적이 있는 경우에만 Histogram을 수집한다. SKEWONLY를 사용하면 Predicate로 사용된 적이 없어도 Histogram을 수집한다.
Column이 Predicate로 사용되었는지 확인은 SYS.COL_USAGE$ View를 통해서 확인할 수 있다.

 exec dbms_stats.gather_table_stats(user, 't1', method_opt=>'for all columns size auto');

 exec dbms_stats.gather_table_stats(user, 't1', method_opt=>'for all columns size skewonly');


3) Index가 존재하는 Column에 대해서만 Histogram을 수집한다. Hisgotram이 Index scan, Table Full scan 이냐를 결정하는 용도로 주로 사용되기 때문이다.
 

exec dbms_stats.gather_table_stats(user, 't1', method_opt=>'for all indexed columns size skewonly');


4) 개별  Column 별로 Bucket Size를 할당 한다.

  exec dbms_stats.gather_table_stats(user, 't1', method_opt=>'for columns c1 size 5 c2 size skewonly');


5)  Function Based Index 에 의해 생성된 Hidden Column에 대한 Histogram 수집한다.

  exec dbms_stats.gather_table_stats(user, 't1', method_opt=>'for all hidden columns size skewonly');



히스토그램의 종류

1) Frequency Histogram

- 값의 Distinct Count와 Bucket 수가 일치하는 경우를 의미한다.

2) Height-Balanced Histogram

- 값의 Distinct Count가 Bucket 수보다 많은 경우를 의미한다. 이럴 경우 값들을 적당한 Bucket으로 분배한 뒤 각 Bucket에 같은 높이(전체 개수/Bucket 개수)를 할당한다.
Histogram 구현 한계상 Distinct Count는 254개 이기 때문에 그 이상의 Distinct Count를 가지는 경우에는 무조건 Height-Balanced Histogram이  생성된다.

  • Popular Value : 하나 이상의 Bucket을 차지하는 값. 빈도가 아주 높은 값이라는 의미

  • Non Popular Value : 빈도가 낮아서 여러개의 Bucket을 차지하지 못하고 다른 값들과 함께 Bucket을 공유하는 값들을 흔히 Non Popular Value라고 부른다. 


 

참고문헌 : OOO - 조동욱 저

'오라클 > Tuning' 카테고리의 다른 글

DBMS_STATS 정리  (1) 2010.10.18
Cardinality 예측 실습  (0) 2010.08.20
[Oracle Virus] DBMS_XPLAN 패키지에 대한 이해  (0) 2010.08.18
SQL*Plus의 Autotrace 활용  (1) 2010.08.13
ASMM (Automatic Shared Memory Management)  (3) 2010.06.05