
1. 개요
DBA_HISTOGRAMS 뷰는 Oracle 옵티마이저가 통계 정보를 활용해 효율적인 실행 계획을 수립할 수 있도록 지원하는 핵심 데이터 딕셔너리입니다. 이 뷰는 테이블 컬럼의 데이터 분포(Distribution)를 세밀하게 저장하며, 히스토그램(Histogram) 기반으로 쿼리 성능을 최적화할 수 있게 해줍니다. 즉, 동일한 SQL 문이라도 데이터의 실제 분포에 따라 다르게 실행 계획을 수립할 수 있는 근거가 되는 뷰입니다.
2. DBA_HISTOGRAMS의 역할
데이터베이스 옵티마이저는 테이블 통계 정보를 기반으로 각 쿼리의 실행 비용을 계산합니다. 이때 단순히 평균값만을 사용하는 것이 아니라, 컬럼 값의 비균등 분포(skewness)를 고려해야 하는 경우가 많습니다. 이를 위해 Oracle은 DBA_HISTOGRAMS에 저장된 히스토그램 정보를 활용하여, 특정 값에 대한 선택도(Selectivity)를 보다 정확히 계산할 수 있습니다.
3. 기본 구조 및 주요 컬럼
DBA_HISTOGRAMS 뷰는 각 컬럼의 데이터 분포를 세분화하여 저장합니다. 특히, 히스토그램 유형(BUCKET, FREQUENCY, HEIGHT-BALANCED 등)에 따라 데이터가 어떻게 분류되었는지를 확인할 수 있습니다.
| 컬럼명 | 데이터 타입 | 설명 |
|---|---|---|
| OWNER | VARCHAR2 | 테이블 소유자 |
| TABLE_NAME | VARCHAR2 | 테이블 이름 |
| COLUMN_NAME | VARCHAR2 | 히스토그램이 정의된 컬럼 이름 |
| ENDPOINT_NUMBER | NUMBER | 히스토그램 버킷 번호 (데이터 범위를 구분) |
| ENDPOINT_VALUE | NUMBER | 버킷의 경계값 (데이터 값의 상한) |
| ENDPOINT_ACTUAL_VALUE | VARCHAR2 | 실제 값 (문자형 컬럼의 경우 사용) |
4. 히스토그램의 유형 비교
Oracle은 컬럼의 데이터 분포 형태에 따라 서로 다른 히스토그램 유형을 제공합니다. 각 유형은 쿼리의 성능에 직접적인 영향을 주기 때문에, 통계 수집 시 정확한 선택이 중요합니다.
| 유형 | 설명 | 적합한 상황 |
|---|---|---|
| FREQUENCY | 각 컬럼 값의 빈도를 직접 기록 | 값의 개수가 적고 특정 값이 자주 등장할 때 |
| HEIGHT-BALANCED | 데이터를 균등한 개수로 구간화 | 값의 범위가 넓고 불균형 분포를 가질 때 |
| TOP-FREQUENCY | 가장 자주 등장하는 상위 값만 기록 | 일부 특정 값이 집중적으로 존재할 때 |
| HYBRID | FREQUENCY와 HEIGHT-BALANCED의 혼합형 | 대규모 테이블의 복합 분포 데이터 |
5. 데이터 예시
-- 특정 테이블 컬럼의 히스토그램 분포 확인
SELECT table_name, column_name, endpoint_number, endpoint_value
FROM dba_histograms
WHERE table_name = 'EMPLOYEES'
AND column_name = 'SALARY'
ORDER BY endpoint_number;
위 쿼리는 SALARY 컬럼의 히스토그램 버킷별 데이터 분포를 보여줍니다. 예를 들어, 특정 구간(ENDPOINT_VALUE)이 급격히 변화한다면 급여 데이터가 불균등하게 분포되어 있음을 의미합니다.
6. 히스토그램의 중요성
- 쿼리 성능 최적화: 옵티마이저가 실제 데이터 분포를 기반으로 정확한 선택도를 계산
- 실행 계획 예측: 인덱스 사용 여부를 데이터 밀도에 따라 자동 결정
- 자동 통계 갱신: DBMS_STATS.GATHER_TABLE_STATS 호출 시 자동 생성
7. 관련 뷰 및 비교
히스토그램 정보는 여러 딕셔너리 뷰와 함께 사용됩니다. 특히 DBA_TAB_COL_STATISTICS나 DBA_TAB_COLUMNS와 함께 조회하면 더 풍부한 정보를 얻을 수 있습니다.
| 뷰 이름 | 역할 | 주요 컬럼 |
|---|---|---|
| DBA_TAB_COLUMNS | 테이블 컬럼의 기본 메타데이터 조회 | DATA_TYPE, NUM_DISTINCT, NUM_NULLS |
| DBA_TAB_COL_STATISTICS | 컬럼 단위 통계 정보 제공 | NUM_BUCKETS, HISTOGRAM |
| DBA_HISTOGRAMS | 실제 데이터 분포 정보 제공 | ENDPOINT_NUMBER, ENDPOINT_VALUE |
8. 실무 활용 전략
DBA_HISTOGRAMS는 성능 진단 및 인덱스 튜닝에 매우 유용합니다. 다음은 실무 환경에서 자주 활용되는 대표적인 시나리오입니다.
- CASE 1 – 특정 컬럼 값 편중 분석: 빈도 높은 값으로 인해 옵티마이저가 인덱스를 사용하지 않는 경우
- CASE 2 – 통계 오류 검증: 오래된 히스토그램 정보로 인해 잘못된 실행 계획이 생성된 경우
- CASE 3 – 조건절 성능 비교: WHERE 조건이 특정 값일 때와 범위 조건일 때 실행 계획이 달라지는 이유 파악
9. 히스토그램 관리 및 재생성
Oracle은 주기적으로 통계를 재수집하여 히스토그램을 갱신합니다. 관리자는 DBMS_STATS 패키지를 사용하여 수동으로 재생성할 수 있습니다.
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'HR',
tabname => 'EMPLOYEES',
method_opt => 'FOR ALL COLUMNS SIZE AUTO'
);
END;
이 구문은 AUTO 모드로 모든 컬럼의 데이터 분포를 분석하고 필요한 컬럼에만 히스토그램을 자동 생성합니다. 수동으로 SIZE 254와 같은 버킷 크기를 지정해 정밀하게 제어할 수도 있습니다.
10. 성능 분석 사례
아래는 히스토그램 유무에 따른 옵티마이저 실행 계획 차이입니다.
| 조건 | 히스토그램 없음 | 히스토그램 있음 |
|---|---|---|
| WHERE SALARY = 5000 | FULL TABLE SCAN | INDEX RANGE SCAN |
| WHERE SALARY BETWEEN 3000 AND 6000 | INDEX RANGE SCAN | BITMAP INDEX MERGE |
| WHERE DEPARTMENT_ID = 10 | RANDOM ACCESS | FILTERED ACCESS |
11. 유지보수 시 주의사항
- 테이블 데이터가 급격히 변경된 경우 반드시 통계 재수집 필요
- ANALYZE 명령 대신
DBMS_STATS패키지 사용 권장 - 히스토그램 버킷 수(NUM_BUCKETS)는 과도하게 크면 성능 저하 유발 가능
- 비정형 데이터(문자형 컬럼)는 ENDPOINT_ACTUAL_VALUE로 조회
12. 결론
DBA_HISTOGRAMS는 단순한 통계 정보가 아닌, 데이터의 실제 패턴을 기반으로 옵티마이저의 판단을 정밀하게 조정하는 도구입니다. 쿼리 성능이 불안정하거나 실행 계획이 비효율적이라면, 이 뷰를 통해 데이터 분포를 직접 점검하는 것이 가장 확실한 해결책이 됩니다. 2025년 현재에도 Oracle의 최신 버전(23ai)에서 여전히 핵심적인 튜닝 지표로 사용되고 있습니다.
13. 참고 출처
- Oracle Database 23ai SQL Tuning Guide
- Oracle DBMS_STATS Package Reference
- Oracle Data Dictionary Reference (DBA_HISTOGRAMS)
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] DBA_2PC_PENDING 뷰 완벽 가이드 : 분산 트랜잭션 복구 핵심 (0) | 2025.10.12 |
|---|---|
| [ORACLE] DBA_2PC_NEIGHBORS 완전 해설 및 분산 트랜잭션 관리 가이드 (0) | 2025.10.12 |
| [ORACLE] ALL_JOBS 완전 해설 및 실무 활용 가이드 (0) | 2025.10.12 |
| [ORACLE] DICT 뷰 완전 정복 : 데이터 사전의 지도이자 개발자의 나침반 (0) | 2025.10.10 |
| [ORACLE] COLS 뷰 완전 가이드 : USER_TAB_COLUMNS의 초경량 별칭으로 컬럼 메타를 빠르게 읽는 법 (0) | 2025.10.10 |