DB_postgreSQL
[PostgreSQL] PostgreSQL에서 MVCC와 VACUUM의 역할과 작동 방식
최선을 다하자!
2025. 5. 13. 10:03
MVCC (Multi-Version Concurrency Control)
MVCC란?
PostgreSQL의 MVCC는 여러 사용자가 동시에 데이터베이스를 읽고 쓰는 작업을 할 수 있도록 하여, 동시성을 보장하는 방식이다.
MVCC는 트랜잭션이 데이터에 접근할 때마다 데이터의 여러 버전을 관리하여 데이터의 일관성과 정합성을 유지한다.
작동 방식
- 모든 데이터는 "버전 정보"를 가진다.
- 각 데이터 Row에는 시스템 컬럼 xmin과 xmax가 존재
- xmin: Row를 생성한 트랜잭션 ID
- xmax: Row를 삭제하거나 수정한 트랜잭션 ID
- 각 데이터 Row에는 시스템 컬럼 xmin과 xmax가 존재
- 데이터를 읽을 때 (SELECT)
- 트랜잭션은 자신이 시작된 시점을 기준으로 유효한 Row만을 읽는다.
- 예를 들어, 트랜잭션 T1이 SELECT를 수행하면, T1은 자신이 시작된 시점에서 유효한 데이터를 조회한다.
- 데이터를 수정할 때 (UPDATE / DELETE)
- UPDATE나 DELETE는 기존 데이터를 삭제하는 것이 아니라, 새로운 버전의 Row를 생성한다.
- 기존 Row는 xmax에 현재 트랜잭션 ID를 기록하여 숨겨지고 (삭제 되는 것이 아님) 새로운 Row 가 생선된다.
Ex)
INSERT INTO users (id, name) VALUES (1, '형님');
트랜잭션 T1이 데이터를 Insert 한다.
Row 생성
ㄴ xmin = T1
ㄴ xmax = NULL
UPDATE users SET name = '마이크로형님' WHERE id = 1;
기존 Row는 숨겨지고, 새 Row A'가 Insert 된다.
기존 Row A
ㄴ xmin = T1
ㄴ xmax = T2
새 Row A
ㄴ xmin = T2
ㄴ xmax = NULL
SELECT * FROM users WHERE id = 1;
트랜잭션 T3이 현재 커밋된 데이터 중에서 유효한 Row A 만 조회하게 된다.
기존 Row 는 숨겨진 상태
SELECT 쿼리 사용 시, 가장 최신의 Row 만 보이게 되는 것임.
근데 저 숨겨진 Row 들이 남겨지면 얼마나 많은 데이터가 쌓이는 건지 상상도 안됨
VACUUM
VACUUM이란?
VACUUM은 PostgreSQL에서 더이상 필요 없는 Row(숨겨진 Row)를 실제로 삭제하여 디스크 공간을 회수하는 작업이다.
MVCC에서 숨겨진 Row (즉, 과거에 커밋된) 는 삭제되지 않고 계속 남아 있기 때문에, 시간이 지나면 디스크 공간이 낭비되고 쿼리 성능이 저하될 수 있기 때문에 VACCUM 을 필수적인 선택이다.
역할
- 숨겨진 Row를 실제로 삭제하여 디스크 공간을 회수 하는 것이 목적 (Reclaimable)
- autovacuum 프로세스가 주기적으로 자동으로 실행되어 숨겨진 Row 탈환. (수동으로도 실행 가능)
- vacuum 은 테이블을 완전히 재작성하여 실제로 디스크 공간을 줄인다.
작동 방식
- 초기 상태 (숨겨진 Row 존재)
- 트랜잭션 T1이 INSERT로 Row를 삽입하고, T2가 UPDATE로 그 Row 를 수정한다.
- 기존 Row는 xmax = T2로 숨겨지겠지?
Row name xmin xmax A '형님' T1 T2 B '마이크로형님' T2 NULL - VACUUM 실행
- VACUUM은 숨겨진 Row A를 실제로 삭제
- Row A는 더 이상 유효한 트랜잭션에서 조회되지 않으므로 디스크에서 삭제된다..
VACUUM users;

종류
유형설명
VACUUM | 불필요한 row만 제거 (공간 회수는 나중) |
VACUUM FULL | 테이블을 완전히 재작성 → 디스크 공간 실제로 줄어듦 단, 락 발생 |
ANALYZE | 통계 정보 갱신 (실행 계획 최적화용) |
autovacuum | PostgreSQL이 자동으로 주기적으로 수행 |
- MVCC
1. PostgreSQL에서 여러 트랜잭션이 동시에 데이터를 읽고 쓸 수 있도록 하며, 이를 위해 데이터의 여러 버전을 관리한다.
2. 트랜잭션은 자신의 시점에 유효한 데이터만 조회하고, 수정 시에는 기존 데이터를 삭제하는 대신 새로운 버전을 생성한다. - VACUUM
1. MVCC에서 생성된 숨겨진(삭제된) Row들을 실제로 삭제하여 디스크 공간을 회수하는 작업이다.
2. 이 과정이 없으면 성능 저하와 디스크 공간 부족으로 고갈이 빨리온다.