개발/데이터베이스

PostgreSQL autovacuum 이해와 활용 방법

피터JK 2025. 1. 17. 18:20
728x90

PostgreSQL는 데이터베이스 성능을 유지하기 위해 autovacuum이라는 자동화된 기능을 제공합니다. autovacuum은 사용자가 명시적으로 VACUUM 명령을 실행하지 않아도, 백그라운드에서 주기적으로 실행되어 테이블을 관리하고 성능 저하를 방지합니다. 이번 포스팅에서는 PostgreSQL의 autovacuum 기능에 대해 자세히 알아보고, 주요 설정과 활용법을 소개합니다.


1. autovacuum란 무엇인가?

PostgreSQL은 데이터 업데이트와 삭제가 이루어지면 기존 튜플(행)을 바로 삭제하지 않고 "죽은 튜플(dead tuples)"로 표시합니다. 이러한 죽은 튜플이 쌓이면 쿼리 성능이 저하될 수 있습니다. autovacuum은 이런 죽은 튜플을 정리하고, 통계를 갱신하여 쿼리 최적화를 돕는 자동화된 프로세스입니다.


2. autovacuum의 주요 역할

autovacuum은 아래 두 가지 주요 작업을 수행합니다:

  1. VACUUM
    • 죽은 튜플을 제거하고 테이블 내 빈 공간을 확보합니다.
    • 이를 통해 테이블 크기가 불필요하게 커지는 것을 방지합니다.
  2. ANALYZE
    • 통계 정보를 갱신하여 쿼리 플래너가 최적화된 실행 계획을 생성할 수 있도록 돕습니다.

3. autovacuum 기본 설정 확인

autovacuum은 PostgreSQL 설치 시 기본적으로 활성화되어 있습니다. 설정을 확인하려면 postgresql.conf 파일에서 아래 항목을 찾을 수 있습니다:

autovacuum = on                     # 기본값: on
autovacuum_max_workers = 3          # 동시에 실행되는 작업 수
autovacuum_naptime = 1min           # 작업 간 간격
autovacuum_vacuum_threshold = 50    # 최소 튜플 변경 기준
autovacuum_vacuum_scale_factor = 0.2 # 테이블 크기에 따른 기준 비율
autovacuum_analyze_threshold = 50   # ANALYZE 작업 최소 기준
autovacuum_analyze_scale_factor = 0.1

주요 파라미터 설명:

  • autovacuum_max_workers: 동시에 실행할 수 있는 autovacuum 작업 수.
  • autovacuum_naptime: 각 작업 간 대기 시간. 기본값은 1분.
  • autovacuum_vacuum_threshold: 테이블에서 최소 변경된 튜플 수.
  • autovacuum_vacuum_scale_factor: 테이블 크기에 비례한 변경된 튜플 비율.

4. 테이블별 autovacuum 설정

특정 테이블에 대해 autovacuum 설정을 사용자화할 수도 있습니다.

활성화 여부 확인

특정 테이블의 autovacuum 설정은 pg_class 뷰를 통해 확인할 수 있습니다:

SELECT relname, reloptions FROM pg_class WHERE relname = 'your_table_name';

테이블별 설정 변경

특정 테이블에서 autovacuum을 활성화 또는 비활성화하려면:

ALTER TABLE your_table_name SET (autovacuum_enabled = true); -- 활성화 
ALTER TABLE your_table_name SET (autovacuum_enabled = false); -- 비활성화

 


5. autovacuum 튜닝 방법

아래와 같은 상황에서는 기본값을 조정하여 autovacuum 성능을 향상시킬 수 있습니다.

(1) 큰 테이블 처리

대규모 테이블에서는 autovacuum_vacuum_scale_factor를 줄여 더 자주 작업하도록 설정합니다:

autovacuum_vacuum_scale_factor = 0.05

(2) 작은 테이블 처리

작은 테이블에서는 autovacuum_vacuum_threshold 값을 낮춰 더 자주 작업하도록 설정합니다:

autovacuum_vacuum_threshold = 10

(3) 작업 간 간격 단축

autovacuum_naptime 값을 줄이면 autovacuum 작업이 더 자주 실행됩니다:

autovacuum_naptime = 30s

6. autovacuum 상태 모니터링

실행 중인 작업 확인

현재 실행 중인 autovacuum 작업은 pg_stat_activity에서 확인할 수 있습니다:

SELECT * FROM pg_stat_activity WHERE query LIKE '%autovacuum%';

테이블별 통계 확인

pg_stat_all_tables 뷰를 통해 각 테이블의 상태를 확인합니다:

SELECT relname, last_autovacuum, last_vacuum, n_dead_tup FROM pg_stat_all_tables WHERE schemaname = 'public';
  • last_autovacuum: 마지막 autovacuum 실행 시간.
  • n_dead_tup: 죽은 튜플 수.

7. autovacuum으로 해결되지 않는 경우

디스크 공간 반환

autovacuum은 디스크 공간을 OS에 반환하지 않습니다. 디스크 공간을 해제하려면 **VACUUM FULL**을 실행해야 합니다:

VACUUM FULL your_table_name;

테이블 잠금 문제 해결

운영 환경에서 테이블 잠금을 최소화하려면 pg_repack 확장을 고려하세요:

pg_repack -U [username] -d [dbname] -t your_table_name

8. 주의 사항 및 PostgreSQL 업그레이드

  • PostgreSQL 9.6은 더 이상 지원되지 않으므로 최신 LTS 버전으로 업그레이드하는 것이 권장됩니다.
  • 최신 버전에서는 autovacuum과 관련된 기능이 더욱 향상되었습니다.

결론

PostgreSQL의 autovacuum은 데이터베이스를 유지 관리하고 성능을 최적화하는 데 중요한 역할을 합니다. 기본 설정만으로도 대부분의 작업을 처리할 수 있지만, 대규모 데이터베이스나 특정 요구사항이 있는 경우 적절한 튜닝이 필요합니다. autovacuum의 상태를 주기적으로 모니터링하고 필요할 경우 수동으로 VACUUM FULL을 실행하여 성능 문제를 예방하세요.


추천 키워드

  • PostgreSQL autovacuum 설정
  • PostgreSQL 성능 최적화
  • VACUUM vs VACUUM FULL
  • PostgreSQL 죽은 튜플 관리

 

728x90