기본개념

  • Histogram이란 Table형태의 빈도(개수)를 Graphical하게 표현한 것이다.
  • Histogram은 Data가 Skew되어 있을때 빛을 발함.
  • Oracle 9i까지는 기본적으로 Histogram이 수집되지 않음. Oracle 10g부터는 오라클 판단에 따라 Histogram 수집여부가 결정됨.
    (METHOD_OPT Parameter의 기본값이 "1"에서 "AUTO"로 변경)
  • Histogram이 없다면 Cardinality계산에 있어서 큰 오류를 범하게 된다.

기본적인 용어들

  • 값(Value)
  • 빈도(Frequency): 특정 값에 속하는 원소의 개수
  • Bucket: 값들이 속하는 범위(Oracle은 최대 254개의 값만 구분할 수 있음). 이 한계로 인해 여러가지 복잡한 개념들과 현상이 발생한다.
  • 특정 컬럼이 A라는 값이 500개, B라는 값이 300개가 들어있다면?
    => A,B가 Value, 500,300이 Frequency

Frequency vs. Height-Balanced

  • Distinct Count만큼 Bucket수가 존재하지 않기 때문에 Frequency Histogram, Height-Balanced Histogram 두 종류의 Histogram이 존재하게 됨.
  • Oracle의 Histogram구현 한계상 구분가능한 최대 Distinct Count는 254개이므로, 그 이상의 Distinct Count를 가지는 경우 무조건 Height-Balanced Histogram이 생성된다.

Frequency Histogram

  • Bucket수가 Distinct 수를 커버할수 있을때..

Height-Balanced Histogram

  • 값의 Distinct 수가 Bucket수보다 많은 경우
  • 값들마다 개별 Bucket을 줄 수 없으므로, 값들을 적당한 Bucket으로 분배한다.
  • Bucket의 높이 : 전체 개수/Bucket 개수

(예제)

  • Table에 컬럼 2개를 생성하고, 하나의 컬럼에는 Distinct Count가 적게, 다른 하나의 컬럼에는 Distinct Count가 많게 데이터 생성
  • SKEWONLY Option으로 Histogram생성(Bucket Size를 Oracle의 판단에 맡김)
C1C2
Distinct Count5300
1/NDV1/5(0.2)1/300(0.0033)
Density(책)0.0000450.4063
Density(실측치)0.0000450.00036

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


SQL> @tab_stat t1
-----------------
01. table stats
-----------------
TABLE_NAME                    : T1
NUM_ROWS                      : 11111
BLOCKS                        : 20
SAMPLE_SIZE                   : 11111
LAST_ANAL                     : 2009/04/17 00:31:00
-----------------

------------------
02. column stats
-----------------
TABLE_NAME                    : T1
COLUMN_NAME                   : C1
NUM_DISTINCT                  : 5
NUM_NULLS                     : 0
DENSITY                       : .0000450004500045
LOW_VALUE                     : C102
HIGH_VALUE                    : C106
HISTOGRAM                     : FREQUENCY
-----------------
TABLE_NAME                    : T1
COLUMN_NAME                   : C2
NUM_DISTINCT                  : 300
NUM_NULLS                     : 0
DENSITY                       : .00036320911154317
LOW_VALUE                     : C102
HIGH_VALUE                    : C204
HISTOGRAM                     : HEIGHT BALANCED
-----------------

  • 컬럼 C1에 대한 Histogram 정보
{code:SQL}
C1 CNT


--

--
1 10000
2 1000
3 100
4 10
5 1
{code}
{code:SQL}
TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE













---





T1 C1 10000 1()
T1 C1 11000 2()
T1 C1 11100 3()
T1 C1 11110 4()
T1 C1 11111 5()
{code}

=>1번값은 10000건, 2번 값은 1000건(11000-10000), 3번 값은 100건(11100-11000).. 이라는 말씀

  • 컬럼 C2에 대한 Histogram 정보
{code:SQL}
C2 CNT


--

--
1 5008
2 5008
3 8
4 8
5 8
6 6
7 6
8 6
9 6
10 6
11 6
.
.
.
{code}
{code:SQL}
TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE













---





T1 C2 113 1()
T1 C2 228 2()
T1 C2 229 3()
T1 C2 230 10()
T1 C2 231 17()
T1 C2 232 24()
T1 C2 233 32()
T1 C2 234 39()
T1 C2 235 46()
T1 C2 236 55()
T1 C2 237 66()
T1 C2 238 77()
T1 C2 239 88()
T1 C2 240 98()
T1 C2 241 112()
T1 C2 242 126()
T1 C2 243 141()
T1 C2 244 155()
T1 C2 245 170()
T1 C2 246 184()
T1 C2 247 199()
T1 C2 248 213()
T1 C2 249 228()
T1 C2 250 242()
T1 C2 251 257()
T1 C2 252 271()
T1 C2 253 286()
T1 C2 254 300()
{code}

=> 하나의 Bucket에 담는 수는 약 43.7(11111/254), 1번 값이 1~113번까지의 Bucket을 차지하고 있으므로, 113*43= 4943이다.

  • ENDPOINT_NUMBER는 Frequency Histogram에서는 빈도를 의미, Height-Balanced Histogram에서는 Bucket번호를 의미함.
  • Popular Value : 하나 이상의 Bucket을 차지하는 Value
  • Non Popular Value : 빈도가 낮아서 다른 값들과 Bucket을 공유하는 Value

문서에 대하여