전체 용어 목록

VACUUM과 autovacuum

PostgreSQL에서 VACUUM은 무슨 일을 하나요?

VACUUM은 업데이트와 삭제 후 남은 죽은 행 버전이 차지하는 공간을 회수하고, 가시성 맵을 갱신하며, 트랜잭션 ID 랩어라운드를 방지합니다. autovacuum이 이를 자동으로 실행합니다.

MVCC 때문에 PostgreSQL에서 UPDATE나 DELETE는 이전 행 버전을 즉시 삭제하지 않습니다. 이전 버전은 더 이상 이를 볼 수 있는 트랜잭션이 없게 되면 죽은 튜플(dead tuple)이 됩니다. VACUUM은 죽은 튜플을 찾아 그 공간을 같은 테이블의 새 행에 재사용할 수 있도록 표시합니다.

일반 VACUUM은 평소의 읽기 및 쓰기와 함께 실행되며, 보통 디스크에 있는 테이블 파일의 크기를 줄이지는 않습니다. VACUUM FULL은 테이블을 다시 써서 공간을 운영 체제에 반환하지만, 실행되는 내내 배타적 잠금을 보유합니다. VACUUM은 또한 인덱스 전용 스캔에 도움이 되는 가시성 맵을 갱신하고, 오래된 행을 동결해 트랜잭션 ID 랩어라운드를 방지합니다. autovacuum 데몬이 VACUUM과 ANALYZE를 자동으로 실행하므로, 수동 실행은 주로 대량의 일괄 변경 후에 유용합니다.

예제

이 예제는 테이블의 모든 행을 업데이트해 죽은 행 버전 10,000개를 남긴 다음, VACUUM (VERBOSE)를 실행해 무엇을 정리했는지 보고하게 합니다. 이어지는 통계 쿼리는 테이블이 마지막으로 수동 VACUUM된 시점을 보여 줍니다.

CREATE TABLE items (id int PRIMARY KEY, qty int);
INSERT INTO items SELECT g, 0 FROM generate_series(1, 10000) AS g;
UPDATE items SET qty = qty + 1;

VACUUM (VERBOSE) items;

SELECT relname, last_vacuum, n_dead_tup
FROM pg_stat_user_tables
WHERE relname = 'items';

확장 없이 기본 PostgreSQL 16 또는 17에서 실행되는 일반 SQL입니다. 버려도 되는 빈 데이터베이스에서 실행하세요.

출처

PostgreSQL 공식 문서(영문)입니다.

관련 용어