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개 행)
'DataBase > postgreSQL' 카테고리의 다른 글
[PostgreSQL] idle in transaction 설정 (0) | 2024.10.25 |
---|---|
[PostgreSQL] initDB 실패 (0) | 2024.10.11 |
[PostgreSQL, CentOS7] 소스코드 컴파일하여 postgresql 16 설치 (소스 설치) (1) | 2024.09.04 |
[PostgreSQL] vacuum을 하는 이유 // vacuum, vacuum full 테스트 (0) | 2024.08.20 |
[postgreSQL] Oracle Linux 7.9 + postgreSQL 12 설치 (0) | 2024.06.04 |