PostgreSQL MVCC와 Vacuum: 데이터 지우는데 용량이 왜 더 늘어날까?

데이터 지우는데 용량이 왜 더 늘어날까?

 

서론

 

PostgreSQL을 운용하던 중, 이런 의문이 들었다.

 

“오래된 데이터를 DELETE로 몇 백만 건 지웠는데 왜 디스크 용량은 줄어들기는커녕 더 늘어나지?”

 

그렇게 궁금해하며 서버 모니터링을 해보니, 테이블의 행 수는 줄었는데 디스크 용량은 그대로 꽉 차서 DB가 기절할 뻔한 상황을 만났다.

공부해 보니 PostgreSQL 특유의 **MVCC(Multi-Version Concurrency Control)**와 **Dead Tuple** 관리 방식 때문이라는 걸 알게 됐다.

 

이 글은 그 과정을 통해 겪은 MVCC 구조와 VACUUM 최적화 실무 전략을 다루고 있다.

부족한 내용이 있을 수 있지만, 나처럼 막 시작한 사람에게는 도움이 될 거라 생각한다.

 


 

📚 PostgreSQL MVCC와 Table Bloating

 

PostgreSQL은 읽기/쓰기 작업이 서로를 가로막지 않도록 MVCC 구조로 설계되어 있습니다.

 


 

핵심 개념

 

1. Dead Tuple이란?

  • PostgreSQL은 UPDATE 실행 시 기존 행을 수정하는 게 아니라 기존 행을 DELETE(Dead Tuple) 처리하고 새 행을 INSERT함
  • DELETE 실행 시에도 디스크에서 실제 지우는 게 아니라 검색 대상에서 제외하는 표시만 남김
  • 이 쓰레기 공간(Dead Tuple)을 주기적으로 수거하지 않으면 디스크가 비대해지는 Table Bloat 현상 발생

 


 

2. AutoVacuum 최적화 튜닝

# postgresql.conf 대용량 서비스용 AutoVacuum 설정 예시
autovacuum_vacuum_scale_factor = 0.05  # 테이블 데이터 5% 변경 시 vacuum 구동
autovacuum_vacuum_cost_limit = 1000    # 처리 리밋 대폭 상향
autovacuum_vacuum_cost_delay = 2ms     # 수거 지연시간 최소화

 


 

정리하며

 

  • PostgreSQL에서 DELETE/UPDATE 연산은 유령 데이터(Dead Tuple)를 생성한다.
  • AutoVacuum이 대용량 데이터 변경 속도를 못 따라가면 주기적인 모니터링과 임계치 튜닝이 필수적이다.

 

DB 내부 엔진의 데이터 저장 구조를 이해하고 고치고 나니, 훨씬 효율적인 데이터베이스 관리가 가능해졌다.

댓글 남기기