Optimizing Oracle Optimizer (2009년)
Histogram 기본 개념 0 0 53,002

by 구루비스터디 Histogram [2018.07.14]


Histogram 기본개념

  • 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 정보

        C1        CNT
---------- ----------
         1      10000
         2       1000
         3        100
         4         10
         5          1



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()

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


컬럼 C2에 대한 Histogram 정보

        C2        CNT
---------- ----------
         1       5008
         2       5008
         3          8
         4          8
         5          8
         6          6
         7          6
         8          6
         9          6
        10          6
        11          6
	.
	.
	.



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()

  • => 하나의 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
"데이터베이스 스터디모임" 에서 2009년에 "OPTIMIZING ORACLE OPTIMIZER " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3889

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입