클라우드 데이터베이스 Oracle 12c 가이드 (2016년)
히스토그램 0 0 18,253

by 구루비스터디 히스토그램 Oracle12c HYBRID_HISTOGRAM dba_histograms dbms_stats [2023.09.05]


히스토그램

  • 데이터의 분포도를 결정하는데 히스토그램을 사용한다.
  • 많은 숫자의 Distinct Value가 Skew된 값이 많을수록 전형적으로 많은 문제를 야기 시켜 왔고 개선 시키 고자 아래와 같은 사항이 포함되었다.
  • 기존의 높이균형 히스토그램에서 Unpopular Value 여러 개가 하나의 버킷에 저장되었다.
  • 12c의 새로운 Hybrid 히스토그램상에서는 이런 한 버킷의 여러 Unpopular Value 중에서 가장 많은 개수를 가진 값을 Almost Popular Value라고 하고 Endpoint-Value로서 반복 횟수를 저장한다.
  • Popular Value는 데이터의 빈도수가 많아서 하나 이상의 버킷으로 할당되는 값. 옵티마이저는 해당 값이 popular Value라면 어떤 타입의 히스토그램으로 관리할지를 결정한다.
  • 도수분포 히스토그램(Frequency Histogram)에서는 Unpopular와 Popular Value만이 존재한다. 반면 하이브리드 히스토그램에서는 Almost Popular Value라는 새로운 개념이 등장한다.

Top-Frequency 히스토그램

Distinct Value가 255개보다 적은 경우
  • 도수분포 히스토그램으로 생성한다.
  • 데이터베이스에서 각 Distinct Value나 해당 값마다 몇 개의 로우가 들어가 있는지 value에 관한 정보를 담는 버킷 하나씩을 할당한다.
  • 도수 분포 히스토그램은 옵티마이저에게 컬럼 내의 Distinct Value에 대한 분포에 관한 정확한 정보를 제공해주는 가장 좋은 히스토그램 타입이다.
Distinct Value가 254보다 큰 경우
  • 높이 균형 히스토그램(Height-Valance Histogram)으로 생성된다. 컬럼의 메타데이터가 요약되어 있다.
  • 옵티마이저가 유니크한 값의 분포도와 카디널리티에 관련된 통계 정보를 가질 수 없기 때문에 문제가 될 가능성이 크가.
  • 이런 여파로 옵티마이저는 해당 값의 분포도에 대해서 추정하는 방법을 사용한다.


  • 데이터베이스는 Distinct 컬럼 값이 카디널리티보다 작은 값은 무시(unpopular Value)하고 좀 더 popular한 컬럼 값(높은 카디널리티를 가진)에 집중한다.
  • 사용 가능한 버킷 개수(디폴트로는 254개까지만 특정 개수를 지정할 수도 있다)보다 Distinct Value가 많은 경우
  • 사용 가능한 버킷( n )에 의해서 점유되는 로우의 비율은 (1 - (1/n)) * 100 보다 작거나 같다. 따라서 만약 500개 버킷을 가졌다면 99.8%의 데이터가 버킷에 맞춰서 사용할 수 있다.
  • 따라서 1,000,000개의 로우를 가진다면 998,000 로우가 500개의 버킷 내에서 맞춰서 충분할 카디널리티를 표현하는 컬럼 값을 가질 수 있다. 실제로 낮은 카디널리티의 값에서는 꽤 많은 공간을 남긴다.
  • dbmsstats 패키지의 ESTIMATEPERCENT 파라미터를 AUTOSAMPLESIZE로 지정한 경우 이전 버전에서 데이터의 비율을 샘플링한 반면에 12C에서는 estimatepercent를 autosamepl_size 값을 설정되어 있는 경우 옵티마이저는 Full Table Scan을 기반으로 히스토그램을 구축 한다.
  • 이는 이전 버전보다 낮은 빈도의 값에(Unique에 가까운 값)에 훨씬 더 신뢰성 있는 데이터를 구축하는 효과가 있다.

하이브리드 히스토그램

  • 하이브리드 히스토그램은 한 버킷으로 여러 개의 값을 표시하는 경우 컬럼 값을 분배 한다.
  • 또한, 해당 버킷에서 맨 마지막 값의 반복되는 횟수를 나타내는 값을 Endpoint Value로서 버킷에 저장한다.
  • 데이터베이스에서 popular Value와 Almost Popular Value에 대한 정확도를 높여서 더 나은 실행 계획 생성을 유도 할 수 있다.
create table hybrid_histogram(id number, the_column number)
insert into hybrid_histogram values(1,1);
insert into hybrid_histogram values(1,2);
insert into hybrid_histogram values(1,2);
insert into hybrid_histogram values(1,2);
insert into hybrid_histogram values(1,51);
insert into hybrid_histogram values(1,51);
insert into hybrid_histogram values(1,71);
insert into hybrid_histogram values(1,81);
insert into hybrid_histogram values(1,81);
insert into hybrid_histogram values(1,82);
insert into hybrid_histogram values(1,83);
insert into hybrid_histogram values(1,83);
commit;
exec dbms_stats.gather_table_stats(null, 'HYBRID_HISTOGRAM', method_opt => 'for columns the_column size 3');



select table_name, column_name, num_distinct, histogram
from user_tab_col_statistics
where table_name = 'HYBRID_HISTOGRAM';



TABLE_NAME                     COLUMN_NAM NUM_DISTINCT HISTOGRAM
------------------------------ ---------- ------------ ---------------
HYBRID_HISTOGRAM               THE_COLUMN            7 HYBRID


select owner, table_name, column_name, endpoint_value, endpoint_repeat_count
from dba_histograms
where owner = 'GHLEE' and  table_name = 'HYBRID_HISTOGRAM'
order by 1, 2, 3, 4;


OWNER      TABLE_NAME                     COLUMN_NAM ENDPOINT_VALUE ENDPOINT_REPEAT_COUNT
---------- ------------------------------ ---------- -------------- ---------------------
GHLEE      HYBRID_HISTOGRAM               THE_COLUMN              1                     1
GHLEE      HYBRID_HISTOGRAM               THE_COLUMN             51                     2
GHLEE      HYBRID_HISTOGRAM               THE_COLUMN             83                     2

  • 단 3개의 히스토그램 버킷을 만들었음.
  • THE_COLUMN 컬럼은 7개의 Distinct Value를 가지고 있지만 3개의 버킷에만 저장되었으면, 버킷에 나열된 Endpoint 값을 참고하고 Endpoint값이 반복되는 개수와 Endpoint Repeat Count값과 일치 도고 있다.
  • 예를 들어 71, 81, 83값이 담겨 있는 마지막 버킷에는 Endpoint Value인 83의 repeat_count를 통해 2개 임을 정확히 알 수 있다.

히스토그램 버킷의 최대 개수 증가

  • 히스토그램으로 할당되는 버킷의 최대 개수가 Default는 254rowlaks 2048개 까지 히스토그램을 위한 버킷을 생성할 수 있다.
"구루비 데이터베이스 스터디모임" 에서 2016년에 "클라우드 데이터베이스 Oracle 12c 가이드" 도서를 스터디하면서 정리한 내용 입니다.

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

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

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

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