생계/PostgreSQL

[ PostgreSQL ] 3. vacuum ( autovacuum 사용하기 )

돌고래트레이너 2025. 8. 3. 16:10
반응형

postgresql 에서 vacuum 이 왜 필요한지는 앞선 글에서 정리했다. 

[ PostgreSQL ] 1. vacuum ( vacuum 이 필요한 이유)

운영환경에서 vacuum 은 사용자가 일일이 실행하는것은 무리가 있고, autovacuum 을 사용하여

설정된 조건을 만족하면 자동 트리거되어 vacuum 이 동작하게 된다. 

 autovacuum 은 vacuum 과 다르게 공유락 사용으로 운영중에도 사용가능하고, 리밋과 설정값 제한으로 리스크가 적다.  


1. 주요 autovacuum 관련 설정값

- autovacuum_enabled (boolean)
  : autovacuum 동작 여부를 켜거나 끈다.
   => ALTER TABLE mytable SET (autovacuum_enabled = false);

- autovacuum_vacuum_threshold (integer)
  : autovacuum이 실행되는 최소 dead tuple(불필요 데이터) 개수 기본값은 50개.
    이 숫자를 늘리면 autovacuum 동작 빈도를 줄일 수 있지만, dead tuple 증가 위험도 존재.

- autovacuum_vacuum_scale_factor (float)
  : 테이블 크기의 몇 %가 변경될 때 autovacuum 동작하는 비율.
    기본값은 0.2 (20%). 예를 들어 10만 행 테이블에서 2만 행 변경 시 autovacuum 동작.
    0으로 설정하면 threshold 수치만으로 판단하여 더 일관된 실행 가능.

- autovacuum_analyze_threshold (integer)
  : autovacuum이 통계수집을 수행하기 위해 수정되어야 하는 최소 레코드 수. 기본 50개.

- autovacuum_analyze_scale_factor (float)
  : 테이블 크기의 몇 % 변경 시 autovacuum ANALYZE를 수행하는지 비율. 기본값 0.1 (10%).

- autovacuum_freeze_min_age (integer)
  : XID freeze를 시도하는 최소 트랜잭션 나이(초기값 50만).

- autovacuum_freeze_max_age (integer)
  : XID wraparound 방지를 위해 반드시 vacuum과 freeze가 필요한 최대 트랜잭션 나이 기본값 약 2억.

- autovacuum_vacuum_cost_delay (integer, ms)
  : autovacuum 작업 중 I/O 작업 간 대기 시간. 0으로 줄이면 빠르지만 부하 증가 가능.
    기본값 20ms 정도.

- autovacuum_vacuum_cost_limit (integer)
  : 한 번의 autovacuum 작업이 소진할 수 있는 "비용 크레딧(credit)"의 최대값을 지정
   기본값은 -1이며, 이 경우 일반 vacuum_cost_limit 값(보통 200)이 사용된다.    
   페이지를 vacuum 처리할 때마다 페이지 유형에 따라 크레딧을 소모된다. 
   ex) shared buffer 내 데이터를 vacuum할 때 1 크레딧, 디스크에서 읽을 때 2 크레딧, 죽은 튜플이 있는 dirty 페이지는 20 크레딧 등
   
   크레딧이 모두 소진되면 autovacuum 프로세스는 멈추거나 잠시 대기(vacuum_cost_delay)한다.
   비용 크레딧 제한이 낮으면 vacuum 작업이 자주 중단되어 dead tuple 누적 가능성이 커진다.
   너무 높으면 autovacuum이 시스템 자원을 과도히 점유해 다른 쿼리에 영향을 줄 수 있다.

이 외에도 다음 설정들이 있는데, 이들은 보통 전역 설정이며 개별 테이블 설정은 지원하지 않습니다.
- vacuum_cost_page_hit, vacuum_cost_page_miss, vacuum_cost_page_dirty (vacuum 비용 산정 관련)


 
 2. autovacuum 설정 변경 예시 

ALTER TABLE my_big_table SET (
  autovacuum_enabled = true,
  autovacuum_vacuum_threshold = 5000,       -- 기본 50 
  autovacuum_vacuum_scale_factor = 0.05,    -- 기본 0.2
  autovacuum_analyze_threshold = 1000,        -- 기본 50 
  autovacuum_analyze_scale_factor = 0.02,    -- 기본 0.1
  autovacuum_vacuum_cost_delay = 10,         -- 기본 20
  autovacuum_vacuum_cost_limit = 1000        -- 기본 -1 => 200
);


3. 테이블의 autovacuum 설정 확인
 
  select c.relname AS table_name,
      option_name,
      option_value
  FROM pg_class c
  LEFT JOIN LATERAL pg_options_to_table(c.reloptions) AS opts(option_name, option_value)
  ON true
 WHERE c.relkind = 'r'  -- 일반 테이블만

*  psql 로 확인하기 

\d+ your_table_name

postgres=> \d+ t_repk
                                                       Table "public.t_repk"
 Column |  Type   | Collation | Nullable |              Default               | Storage  | Compression | Stats target | Description
--------+---------+-----------+----------+------------------------------------+----------+-------------+--------------+-------------
 id     | integer |           | not null | nextval('t_repk_id_seq'::regclass) | plain    |             |              |  data   | text    |           |          |                                    | extended |             |              | Indexes:
    "t_repk_pkey" PRIMARY KEY, btree (id)
Access method: heap
Options: autovacuum_vacuum_scale_factor=0.05, autovacuum_vacuum_threshold=1000

반응형