본문 바로가기
카테고리 없음

통계 정보와 수집 전략 (Statistics & Collection Strategy)

by 유형제맘 2025. 8. 15.

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 성능 보장
  • 자동 + 수동 수집 전략을 적절히 혼합
  • 샘플링, 히스토그램 등 옵션을 활용해 품질 향상