1. 통계 정보란?
데이터베이스에서 통계 정보(Statistics)는 옵티마이저가 SQL 실행 계획을 세울 때 사용하는
데이터의 특성 정보를 말합니다.
예를 들어 테이블의 총 행 수, 컬럼 값의 분포, 인덱스의 구조 등이 이에 해당합니다.
통계 정보는 SQL 성능 최적화의 핵심 재료입니다.
2. 통계 정보가 중요한 이유
- 옵티마이저는 통계 정보를 바탕으로 최적의 실행 계획 수립
- 통계 정보가 부정확하면 잘못된 실행 계획 → 성능 저하
- 최신 통계 정보는 인덱스 사용 여부, 조인 방식 결정 등에 직접 영향
3. 통계 정보의 주요 항목
항목 | 설명 | 예시 |
---|---|---|
Table Rows | 테이블 총 행 수 | 1,200,000 |
Blocks | 테이블이 차지하는 블록 수 | 15,000 |
Distinct Keys | 컬럼의 고유 값 개수 | 50 |
Density | 컬럼 값의 중복 정도 | 0.02 |
Histogram | 컬럼 값의 분포 정보 | 균등분포 / 비균등분포 |
4. 통계 정보 수집 방법
(1) 자동 수집
- DBMS에서 제공하는 자동 통계 수집 스케줄러 사용
- 보통 야간/비업무 시간에 수행
- 예: Oracle의
DBMS_STATS.AUTO_STATS
(2) 수동 수집
- 특정 테이블, 인덱스에 대해 직접 통계 수집 명령 실행
- 데이터 변동이 많을 때나 성능 문제 발생 시 활용
```sql -
- 테이블 통계 수집
BEGIN
DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMP');
END;
/
- 테이블 통계 수집
-- 인덱스 통계 수집
BEGIN
DBMS_STATS.GATHER_INDEX_STATS('SCOTT', 'EMP_IDX');
END;
/
---
## 5. 수집 주기 설정 전략
- **데이터 변동 빈도 기준**으로 주기 설정
- 변동이 거의 없는 기준 정보 테이블 → 분기별 수집
- 매일 수백만 건 변동하는 로그 테이블 → 매일 또는 실시간 수집
- **업무 특성 고려**
- 성수기/비성수기, 월말 정산 등 시기별 변화량 반영
- **성능 영향 최소화**
- 통계 수집 작업은 보통 비업무 시간에 실행
---
## 6. 통계 정보 품질 향상 팁
- **샘플링 비율 조정**
- 대용량 테이블은 `SAMPLE` 옵션으로 효율적으로 수집
```sql
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'SCOTT',
tabname => 'SALES',
estimate_percent => 10
);
END;
/
- 히스토그램 활용
- 값 분포가 비균등한 컬럼은 히스토그램 생성 → 옵티마이저 판단 정확도 향상
- 불필요한 컬럼 통계 제외
- 통계 필요 없는 컬럼은 제외하여 수집 시간 단축
7. 통계 정보와 성능 관계 예시
[부정확한 통계]
→ 옵티마이저가 잘못된 조인 순서/방식 선택
→ 불필요한 Full Table Scan 발생
→ 응답 시간 증가
[정확한 통계]
→ 효율적인 인덱스 사용
→ 최소한의 I/O 발생
→ 빠른 응답
8. 정리
- 통계 정보는 옵티마이저의 눈과 같음
- 정확하고 최신 상태를 유지해야 SQL 성능 보장
- 자동 + 수동 수집 전략을 적절히 혼합
- 샘플링, 히스토그램 등 옵션을 활용해 품질 향상