본문 바로가기
🗄️ DB_이야기/# 🐘 PostgreSQL

🐘 [PostgreSQL] PostgreSQL의 핵심 개념, MVCC란?

by gwon_s 2025. 7. 10.

🔍 들어가며

PostgreSQL을 공부하다 보면 꼭 등장하는 개념이 바로 **MVCC(Multi-Version Concurrency Control)**입니다.

 

이 개념을 제대로 이해하면 왜 PostgreSQL이 동시성 처리에 강한지, 그리고 왜 VACUUM이 필요한지 자연스럽게 연결됩니다.


💡 MVCC(Multi-Version Concurrency Control) 란?

MVCC는 하나의 데이터를 여러 버전으로 관리하는 방식입니다.

 

즉, 수정하거나 삭제해도 기존 데이터를 즉시 지우지 않고, 새로운 버전을 만들어 사용자마다 필요한 시점의 데이터를 보여주는 기술입니다.

 

이 방식 덕분에 PostgreSQL은 읽기와 쓰기를 동시에 처리해도 충돌이 거의 없습니다.


🧪 예시로 쉽게 이해하기

🧾 상황 설명

현재 테이블에서 아래 쿼리문을 차례로 수행

UPDATE 사원테이블 SET 부서='생산팀' WHERE 이름='홍길동';
COMMIT;
DELETE FROM 사원테이블 WHERE 이름='김두한';
COMMIT;

 

1. 사원테이블에서 홍길동씨의 부서명을 품질팀에서 생산팀으로 변경하면 기존 데이터는 유지되고 새로운 데이터가 추가됩니다.

2. 사원테이블에서 김두한씨의 데이터를 삭제하면 삭제데이터란 표시만 남겨두고 실제론 테이블에 남아있게 됩니다.

 

 XMAX값이 NULL 인 Tuple의 경우 가장 최신 버전의 데이터를 의미하며, XMAX값이 설정된 Tuple은 해당 시점 과거 버전의 데이터(삭제 및 변경)를 의미합니다.

 

PostgreSQL에서는 각 Tuple마다 생성되거나 변경된 시점을 각 Tuple별로 존재하는 XMIN, XMAX라는 메타데이터 필드에 XID를 기록하여 비교하는 방식을 사용해 어떤 Tuple을  사용자가 읽을 수 있는지 버전 관리를 하게 됩니다.

 


🛑 MVCC(Multi-Version Concurrency Control) 의 단점

1. 공간 사용의 비효율

  • 변경 전 데이터도 여전히 테이블에 남아 있기 때문에 👉 디스크 공간을 더 많이 차지하게 됩니다.
  • 특히 UPDATE, DELETE 가 빈번한 테이블에서는 👉  많은 버전의 튜플이 쌓이면서 쿼리 수행 시 스캔 비용 증가
  • PostgreSQL은 각 레코드마다 XID를 저장 👉 페이지 단위의 공간 비효율 발생

2. XID 부족 현상

  • XID는 각 레코드에 4바이트 크기로 저장 👉 약 43억 트랜잭션 후에 ID가 다시 0부터 재사용

📌 정리

MVCC는 강력한 기능이지만,

VACUUM과 모니터링을 통한 유지보수가 동반되어야 안정적으로 운영할 수 있습니다.


DBA의 세심한 관리가 필요한 부분입니다. 💡