오라클 데이터베이스에서 통계정보(Statistics) 갱신은 쿼리 최적화를 위해 매우 중요한 작업입니다. 통계정보가 최신 상태가 아닐 경우, 옵티마이저(Optimizer)가 비효율적인 실행 계획을 선택하여 성능이 저하될 수 있습니다. 갱신이 필요한 주요 이유는 다음과 같습니다
개요
1. 데이터 분포 변경
• 테이블에 대량의 데이터가 추가, 수정, 삭제되면 기존의 통계정보가 실제 데이터와 일치하지 않을 수 있습니다.
• 인덱스가 재구성되거나 새로운 데이터 패턴이 생길 경우도 마찬가지입니다.
2. 쿼리 실행 계획 최적화
• 오라클 옵티마이저는 통계정보를 기반으로 실행 계획을 수립합니다.
• 잘못된 통계정보가 있으면 잘못된 인덱스 사용, 풀 테이블 스캔 증가, 조인 방식 오류 등의 문제가 발생할 수 있습니다.
3. Bind Variable과 Adaptive Optimization 지원
• 바인드 변수를 사용하는 경우, 최신 통계정보가 없다면 잘못된 실행 계획이 고정될 가능성이 높습니다.
• Oracle 12c 이상에서는 Adaptive Query Optimization을 통해 실행 계획을 동적으로 변경할 수 있지만, 통계정보가 최신이어야 효과적입니다.
4. Histogram 및 Extended Statistics 활용
• 히스토그램(Histogram) 정보를 통해 데이터 값의 불균형을 파악하여 인덱스 활용을 최적화할 수 있습니다.
• 조인에 사용되는 여러 컬럼의 상관관계(Extended Statistics) 를 업데이트하면 옵티마이저가 더 나은 실행 계획을 선택할 수 있습니다.
통계정보 갱신 방법
1. 특정 테이블만 갱신
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA_NAME', 'TABLE_NAME');
2. 특정 인덱스만 갱신
EXEC DBMS_STATS.GATHER_INDEX_STATS('SCHEMA_NAME', 'INDEX_NAME');
3. 전체 스키마 갱신
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCHEMA_NAME');
4. 전체 데이터베이스 갱신
EXEC DBMS_STATS.GATHER_DATABASE_STATS;
5. AUTO 옵션 활용 (변경된 부분만 갱신)
EXEC DBMS_STATS.GATHER_DATABASE_STATS(options => 'GATHER AUTO');
통계정보 갱신 주기
• 대량의 DML(INSERT, UPDATE, DELETE)이 발생한 후
• 배치 작업 또는 대규모 데이터 적재 이후
• 주기적으로(예: 매일 새벽 또는 주말 배치 수행 시)
→ Oracle 자동 통계 수집 기능(AUTO_TASK, GATHER AUTO) 을 활용할 수도 있음.
주의사항
1. 실시간 운영 환경에서는 신중하게 수행해야 함
• GATHER_DATABASE_STATS 같은 명령어는 시간이 오래 걸릴 수 있으므로 배치 시간에 수행하는 것이 좋음.
• 일부 테이블에 대해서만 GATHER_TABLE_STATS를 수행하는 것이 더 효율적일 수도 있음.
2. 히스토그램 사용 시 주의
• 데이터 패턴이 자주 변하지 않는 경우 히스토그램이 오히려 실행 계획을 불안정하게 만들 수도 있음.
3. 수집된 통계정보 백업 가능
• 기존 통계정보를 보존하고 싶다면, 백업 후 갱신하는 것이 좋음