피드로 돌아가기
PostgreSQL Internals: Inside the Storage Engine
Dev.toDev.to
Database

WAL부터 MVCC까지, PostgreSQL 저장 엔진의 고밀도 내부 동작 분석

PostgreSQL Internals: Inside the Storage Engine

priteshsurana2026년 4월 5일11advanced

Context

디스크 쓰기의 비원자성으로 인한 데이터 파손 위험 존재. UUID 기반 PK 사용 시 발생하는 인덱스 페이지 분할과 쓰기 증폭 문제 직면. MVCC 구현을 위한 업데이트 방식의 특성으로 인한 Heap Bloat 발생 가능성 존재.

Technical Solution

  • 데이터 안정성 확보를 위해 Heap 수정 전 모든 변경 사항을 순차 로그인 WAL에 먼저 기록하는 Write-Ahead Logging 설계
  • 메모리 효율을 위해 8KB 단위의 페이지 캐시인 shared_buffers를 최우선 참조하고 Free Space Map(FSM)으로 최적의 삽입 위치 탐색
  • 읽기 성능 극대화를 위해 데이터 행을 정렬 없이 저장하는 Heap 구조와 이를 효율적으로 탐색하는 B+Tree 인덱스 분리 구조
  • 동시성 제어를 위해 기존 데이터를 수정하지 않고 새 버전을 생성하는 MVCC 방식 채택 및 Dead Tuple 관리
  • 불필요한 공간 낭비와 I/O 증가를 방지하기 위해 오래된 튜플을 식별하고 공간을 재사용 가능하게 만드는 VACUUM 프로세스 운용

Impact

  • synchronous_commit 설정을 off로 변경 시 최대 200ms(wal_writer_delay 기본값)의 데이터 손실 위험을 감수하며 쓰기 지연 시간 대폭 절감

Key Takeaway

  • 쓰기 성능 최적화를 위해서는 랜덤한 UUID보다 순차적 키를 선택하여 B+Tree 페이지 분할 및 쓰기 증폭을 최소화하는 설계 원칙 필요.

쓰기 지연 시간 단축이 최우선인 환경에서는 synchronous_commit 설정을 검토하고, 업데이트가 빈번한 테이블은 autovacuum 설정 최적화를 통해 Heap Bloat를 관리할 것

원문 읽기