오라클 옵티마이저 통계 수집 실무 가이드 – 자동 수집 vs 수동 수집, 무엇이 더 좋을까?

Posted by heoncode
2025. 5. 16. 17:31 오라클 실무 쿼리 튜닝
728x90
반응형
SMALL

오라클 데이터베이스에서 SQL 성능을 결정짓는 핵심 요소 중 하나는 바로 옵티마이저입니다. 이 옵티마이저가 쿼리 실행 계획을 수립할 때 가장 중요한 기준이 되는 것이 바로 통계 정보입니다. 그런데 이 통계를 언제, 어떻게 수집해야 하는지에 대한 기준이 명확하지 않아 실무에서 혼란을 겪는 경우가 많습니다. 이번 글에서는 통계 수집의 개념과 자동 수집 vs 수동 수집의 차이, 실무에서의 적용 방식을 정리합니다.

통계 정보란?

통계 정보는 테이블의 데이터 양, 컬럼의 값 분포, 인덱스 상태 등을 바탕으로 옵티마이저가 실행 계획을 최적화하는 데 사용하는 자료입니다. 대표적인 항목으로는 테이블의 ROW 수, 블록 수, 컬럼의 DISTINCT 수, NULL 비율 등이 있으며, 이 정보는 DBMS_STATS 패키지를 통해 수집됩니다.

자동 통계 수집의 특징

오라클 10g 이후부터는 매일 밤 10시~오전 2시 사이에 자동 통계 수집 작업이 실행되도록 설정되어 있습니다. 기본적으로는 GATHER_STATS_JOB이라는 잡이 이를 담당하며, 새로 생성된 테이블이나 변경된 데이터가 많은 테이블 위주로 통계를 수집합니다.

장점:

  • 별도의 관리 없이 자동 실행
  • 전체 테이블이 아닌 필요한 부분만 수집
  • 유지보수 부담이 적음

단점:

  • 예측이 어려운 시점에 수집될 수 있음
  • 중요한 배치 직후 통계가 반영되지 않을 수 있음
  • 테이블에 따라 과소 또는 과잉 수집이 발생할 수 있음

수동 통계 수집의 필요성

데이터가 급격히 바뀌거나, 대규모 배치 이후에 성능 문제가 발생하는 경우에는 자동 수집을 기다리는 것이 아니라 수동으로 즉시 통계를 갱신하는 것이 안전합니다. 이럴 때는 DBMS_STATS.GATHER_TABLE_STATSGATHER_SCHEMA_STATS 프로시저를 활용합니다.

예시:

BEGIN
    DBMS_STATS.GATHER_TABLE_STATS(
        ownname => 'SCOTT',
        tabname => 'EMP',
        cascade => TRUE
    );
END;

이처럼 수동 수집은 제어 가능성이 높고, 성능 이슈가 발생하기 전 사전에 대비할 수 있다는 장점이 있습니다.

실무 적용 팁

  • 대규모 데이터 변경 직후에는 수동 수집을 반드시 수행하는 것이 안전합니다.
  • 배치 작업이 정기적으로 이뤄지는 시스템이라면, 배치 이후 수동 수집을 자동화된 스크립트로 포함하는 것이 좋습니다.
  • 통계 수집 후 성능 저하가 발생할 경우에는 이전 통계를 롤백할 수 있도록 DBMS_STATS의 EXPORT/IMPORT 기능을 사용해 백업해두는 습관도 필요합니다.

예시 (통계 백업 및 복원):

-- 백업
EXEC DBMS_STATS.EXPORT_TABLE_STATS('SCOTT', 'EMP', 'STAT_BACKUP');

-- 복원
EXEC DBMS_STATS.IMPORT_TABLE_STATS('SCOTT', 'EMP', 'STAT_BACKUP');

결론

자동 수집은 편리하지만 예외 상황에 항상 대응할 수는 없습니다. 실무에서는 자동 수집을 기본으로 하되, 중요한 시점이나 대량 변경 이후에는 수동 수집을 병행해야 안정적인 SQL 성능을 유지할 수 있습니다. 옵티마이저의 의사결정을 믿기 위해서는 우리가 통계 수집이라는 재료를 제대로 공급해줘야 한다는 점을 기억해야 합니다.

#오라클 #SQL튜닝 #옵티마이저 #통계수집 #DBMS_STATS #실무팁 #성능최적화

728x90
반응형
LIST