yozm.tech
피드로 돌아가기
news.hada.ioHOTAI 재작성

PostgreSQL의 MVCC는 나쁘다. 다른 DB도 마찬가지다

PostgreSQL의 MVCC(다중 버전 동시성 제어)가 쓰기 증폭, 테이블 팽창, VACUUM 부담 등 여러 문제로 비판받지만, 이는 MVCC 자체의 결함이 아닌 특정 설계 선택의 결과라는 분석이 나왔습니다. 다른 데이터베이스들도 과거 버전 관리에 다른 방식을 택할 뿐, MVCC의 근본적인 비용은 존재하며 각자의 장단점이 명확합니다. PostgreSQL은 리더를 막지 않고 빠른 롤백을 선택한 대가로 운영자의 관리가 필요합니다.

6시간 전·2026.08.10·읽기 1·neo https://news.hada.io/user/neo

PostgreSQL의 MVCC(다중 버전 동시성 제어) 구현 방식이 쓰기 증폭, 테이블 팽창(bloat), VACUUM(진공 청소) 부담, 그리고 32비트 XID(트랜잭션 ID) 랩어라운드(wraparound) 문제로 종종 비판받아왔습니다. 하지만 최근 보링SQL(boringsql.com)의 분석에 따르면, 이러한 문제들은 MVCC 자체의 결함이라기보다는 과거 데이터를 테이블 내부에 남기고 나중에 정리하는 PostgreSQL의 특정 설계 선택에서 비롯된 것이라고 합니다. 리더가 라이터 작업을 방해하지 않으려면 모든 데이터베이스는 과거 버전의 데이터를 어딘가에 보관해야 하며, 그 방식의 차이일 뿐 MVCC의 비용은 본질적으로 사라지지 않는다는 설명입니다.

PostgreSQL의 UPDATE 작업은 기존 행을 직접 수정하는 대신, 새로운 행 버전을 힙(heap)에 추가하고 이전 버전에는 t_xmax를 기록하여 두 버전을 모두 디스크에 남깁니다. 어떤 버전이 보이는지는 읽기 시점에 판단하며, 더 이상 필요 없는 버전은 나중에 VACUUM 프로세스가 정리합니다. 이러한 방식은 인덱스가 물리적 행 위치(ctid)를 가리키므로, 인덱스되지 않은 컬럼이 변경되어도 새 행 버전을 위한 인덱스 엔트리가 필요할 수 있어 쓰기 증폭을 유발합니다. 또한, UPDATE는 사실상 INSERT와 지연된 DELETE와 같아 테이블 팽창을 일으키고, 오래 열린 트랜잭션은 VACUUM이 과거 튜플을 제거하는 것을 막아 데이터베이스 전체의 XID 가시성(xmin horizon)을 뒤로 밀어낼 수 있습니다. 32비트 XID는 약 40억 개의 트랜잭션 후 랩어라운드 문제를 일으켜 주기적인 튜플 프리징(freezing)이 필요합니다.

반면 오라클(Oracle)과 MySQL의 InnoDB는 과거 버전을 테이블 외부의 언두 로그(undo log)에 저장합니다. 이 방식은 테이블에 최신 행만 남겨 힙 팽창을 피하고, 세컨더리 인덱스가 프라이머리 키를 가리키므로 인덱스 업데이트 비용이 적습니다. SQL Server는 READ_COMMITTED_SNAPSHOT이나 SNAPSHOT 옵션을 켜면 임시 데이터베이스(tempdb)의 버전 스토어(version store)에 과거 버전을 저장하며, 몽고DB(MongoDB)의 WiredTiger는 주로 메모리 내 델타 체인(delta chain)으로 과거 버전을 관리합니다. 이들 시스템은 PostgreSQL의 문제를 피하는 대신, 롤백 비용 증가, 과거 버전 읽기 비용 증가, '스냅샷 투 올드(snapshot too old)' 오류, 임시 데이터베이스 팽창, 캐시 압력 증가 등 다른 형태의 비용을 지불합니다.

결론적으로 MVCC의 비용은 사라지지 않고 다른 곳으로 이동할 뿐입니다. PostgreSQL은 가비지(garbage)가 눈에 보이고 VACUUM을 직접 관리해야 하는 대신, 리더를 막지 않고 오래된 스냅샷을 기본적으로 취소하지 않으며, 큰 트랜잭션도 거의 즉시 롤백할 수 있는 장점을 선택했습니다. 각 데이터베이스 시스템은 특정 워크로드와 운영 철학에 맞춰 MVCC 구현 방식을 선택하며, 이는 운영자가 각 시스템의 특성을 이해하고 적절히 관리해야 하는 이유를 보여줍니다. 특정 시스템이 '나쁘다'기보다는, 각자의 설계 트레이드오프(trade-off)를 이해하는 것이 중요합니다.

1인 창업자를 위한 기회 분석
AI 분석 · 참고용이며 검증이 필요합니다
3/10
약한 신호
3점인가

문제는 명확하지만, 이미 다양한 모니터링/튜닝 도구가 존재하며, 1인이 차별화된 솔루션을 만들기는 쉽지 않습니다. PostgreSQL 전문 지식이 필요합니다.

문제 / 미충족 수요

PostgreSQL 운영 시 MVCC 설계로 인한 성능 문제(쓰기 증폭, 테이블 팽창, VACUUM 관리 부담)를 겪는 사용자가 많습니다.

한국 시장
국내 있음한국에서도 PostgreSQL 사용이 증가하고 있어, 운영 효율화에 대한 니즈가 존재합니다.
수익 모델

B2B SaaS 구독 · 돈 내는 주체: PostgreSQL을 운영하는 중소기업 개발팀 또는 스타트업 CTO

1인 실현 가능성
3/5

PostgreSQL 내부 동작에 대한 깊은 이해와 튜닝 경험이 필요하지만, 자동화된 진단 도구는 1인 개발로도 시작할 수 있습니다.

진입 지점 (Wedge)

PostgreSQL MVCC 문제를 진단하고 최적화 방안을 제시하는 자동화된 진단 및 권장 SaaS 도구

이번 주 첫 실험

PostgreSQL 사용자 커뮤니티에서 MVCC 관련 가장 빈번한 문제점과 해결책을 수집하고, 이를 바탕으로 간단한 진단 스크립트 프로토타입을 개발합니다.

Original source
이 글은 news.hada.io의 기사를 yozm.tech가 한국어로 재작성한 버전입니다.
원문 보기