autovacuum이 어떻게 호출되는 것인지에 대한 공부를 하기 위해서 작성

파라미터는 튜닝하지 않음

 

용어

Age 

- 말 그대로 Age

- Table과 Tuple의 나이를 뜻한다. 테이블 생성 시 또는 Tuple을 테이블에 처음 insert할 때의 Age는 1부터 시작한다고 한다.

- Transaction이 발생할 때마다 Table의 Age 및 Tuple의 Age가 1씩 증가한다고 한다.

- 그래서 계속 Age가 증가하다가 Age 관련 특정 파라미터인 autovacuum_freeze_max_age 의 임계치에 도달하게 되면 XID Wraparound를 방지하기 위해 Anti Wraparound Vacuum 대상이 되고,  수행이 된 후에는 다시 Table Age과 Tuple Age가 1로 회귀한다.

- 그런데, Table Age는 Age 그자체로 Anti Freeze의 대상이 되지 않는다고 한다. 중요한 것은 Table Age는 테이블 내에 존재하는 가장 높은 Age를 먹은 Tuple(Age)에 종속된다고 한다. 그렇기 때문에 Table의 Age만 보고도 이 테이블에는 Anti Freeze 가 필요한 Tuple Age가 있구나 라고 생각하게 되어 Autovacuum의 대상이 된다고 한다.

 

 

Autovacuum이 호출되는 조건

 

Vacuum 동작을 DB단에서 임계치에 따라 자동으로 수행하는 것이 AutoVacuum이라고 하며, AutoVacuum은 기본적으로 아래 두가지 상황에서 수행됨

  • Dead Tuple의 개수의 누적치가 임계치에 도달했을 때
  • Table이나 Tuple의 age가 누적되어 임계치에 도달했을 때

- Dead Tuple에 의한 vacuum 은 쿼리의 성능문제, 그리고 물리적인 disk 이슈를 방지하기 위해 수행되는 vacuum

이고

- Age가 임계치에 도달했을 때 수행되는 vacuum은 자칫하면 DB의 동작을 모두 멈추게 할 수 있는 Transaction ID Wraparound 현상을 방지하기 위한 vacuum임

 

 

Autovacuum이 호출되는 계산 조건과 파라미터

 

1) Dead_Tuple의 누적치가 Threshold에 도달했을 때

//계산 조건

vacuum threshold = autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor * number of Tuples
// 주요 파라미터
ontune=# select name, setting from pg_settings where name in ('autovacuum_vacuum_scale_factor', 'autovacuum_vacuum_threshold'); 
              name              | setting                                                                      
--------------------------------+---------
 autovacuum_vacuum_scale_factor | 0.2
 autovacuum_vacuum_threshold    | 50
(2개 행)

 

 

2) Table Age나 Tuple의 Age가 누적되어서 임계치에 도달했을 때

1. 테이블의 age가 autovacuum_freeze_max_age(default 2억) 파라미터 임계치를 초과한 경우2. vacuum_freeze_table_age  <  테이블의 age  < autovacuum_freeze_max_age
=> 테이블의 age가 위 두 파라미터 값 사이에 속하면서 해당 테이블에 vacuum이 호출되었을 때

//주요 파라미터
ontune=# select name, setting from pg_settings where name like '%freeze%';
                name                 |  setting                                                                
-------------------------------------+-----------
 autovacuum_freeze_max_age           | 200000000
 autovacuum_multixact_freeze_max_age | 400000000
 vacuum_freeze_min_age               | 50000000
 vacuum_freeze_table_age             | 150000000
 vacuum_multixact_freeze_min_age     | 5000000
 vacuum_multixact_freeze_table_age   | 150000000
(6개 행)

 

 

계속 까먹네;