본문 바로가기
Database/Oracle

[ORACLE] USER_TAB_HISTOGRAMS 뷰로 SQL 옵티마이저 힌트 최적화하기

by Papa Martino V 2025. 8. 8.
728x90

USER_TAB_HISTOGRAMS 뷰로 SQL 옵티마이저 힌트 최적화하기
[ORACLE] USER_TAB_HISTOGRAMS

1. USER_TAB_HISTOGRAMS란?

USER_TAB_HISTOGRAMS는 Oracle에서 컬럼 값의 **분포 상태를 히스토그램 형태로 저장하는 데이터 딕셔너리 뷰**입니다.

Oracle 옵티마이저(CBO)는 히스토그램 정보를 활용하여 **비균등한 데이터 분포에 최적화된 실행 계획**을 수립합니다.

2. 히스토그램이란?

히스토그램은 컬럼의 값들이 얼마나 고르게 또는 쏠려 있는지를 보여주는 통계 모델입니다. 다음과 같은 유형이 있습니다:

  • NONE: 히스토그램 없음 (기본 분포로 간주)
  • HEIGHT BALANCED: 값 빈도 기준 분할
  • FREQUENCY: 값 자체의 빈도 기록
  • TOP-FREQUENCY: 자주 나오는 값만 추출
  • HYBRID: 혼합형 (자동 생성 시 등장)

3. 주요 컬럼 설명

컬럼명 설명
TABLE_NAME 히스토그램이 적용된 테이블 이름
COLUMN_NAME 히스토그램이 수집된 컬럼 이름
ENDPOINT_NUMBER 히스토그램 구간 번호 (오름차순)
ENDPOINT_VALUE 히스토그램 구간에 해당하는 컬럼 값 (RAW 형식)
ENDPOINT_ACTUAL_VALUE 실제 값 표시 (21c 이후 지원)

4. 실전 활용 예제

-- 특정 테이블의 히스토그램 확인
SELECT COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE
FROM USER_TAB_HISTOGRAMS
WHERE TABLE_NAME = 'PRODUCTS'
ORDER BY COLUMN_NAME, ENDPOINT_NUMBER;

-- 히스토그램이 존재하는 컬럼 목록
SELECT DISTINCT TABLE_NAME, COLUMN_NAME
FROM USER_TAB_HISTOGRAMS;
      

참고: 히스토그램은 DBMS_STATS 패키지의 METHOD_OPT 옵션으로 생성됩니다.

5. 히스토그램 관련 뷰 비교

뷰 이름 내용 범위
USER_TAB_HISTOGRAMS 히스토그램 데이터 (구간별 값 분포) 사용자 소유 객체
USER_TAB_COL_STATISTICS 컬럼 단위 통계 정보 (NUM_DISTINCT, NULL 비율 등) 사용자 소유 객체
USER_HISTOGRAMS 히스토그램 메타정보 (CBO용) 더 자세한 내부 분포 정보 제공

6. 고급 활용 전략

  • 비정형 분포 컬럼 자동 탐지: NUM_DISTINCT ≠ 실질 범위인 경우 히스토그램 유도
  • 옵티마이저 강제 힌트: 히스토그램 기반 인덱스 활용 힌트 적용 가능
  • 히스토그램 유지 관리: DBMS_STATS.GATHER_TABLE_STATS 시 주기적으로 갱신

7. 결론

USER_TAB_HISTOGRAMS는 Oracle 옵티마이저가 **데이터 분포를 정밀하게 파악하고 실행 계획을 최적화**할 수 있도록 지원하는 필수 뷰입니다. 특히 불균형 데이터가 많은 컬럼이나 조건절에 자주 등장하는 컬럼에 대해 히스토그램을 활용하면 성능 개선에 큰 도움이 됩니다.

참고 자료

728x90