IT/PostgreSQL

[PostgreSQL] MVCC란?

자연산 금붕어 2025. 2. 28. 09:41

[ MVCC? ]

  • Multi-Version Concurrency Control (다중 버전 동시성 제어)
  • 과거부터 현재까지의 데이터를 버전 별로 구분하여 동시에 관리, 제공하는 기법
  • 사용자가 조회를 시작한 시점 기준의 데이터를 제공 받을 수 있음
  • 쿼리가 시작된 시점의 XID와 같거나 작은 데이터 버전을 읽는 것이 핵심
  • Read와 Writer 간의 Blocking 현상을 제거함으로써 동시성 상승

[ PostgreSQL MVCC? ]

  • 이전 버전 데이터와 현재 버전 데이터를 동일한 테이블 내에서 보관
  • 그로 인해 Dead Tuple이 증가하여 테이블 사이즈 Bloat현상이 발생
    • Bloat 현상 : 실제 데이터 크기보다 데이터베이스 크기가 커지는 현상
  • 각 레코드(row)별로 4Byte의 XID(버전 정보)를 주어 시점을 식별
  • Vacuum을 통해 MVCC로 발생하는 Dead Tuple 관리

 

[ Oracle VS PostgreSQL 간단 설명 ]

  • Oracle
    • Oracle, MySQL은 최신 버전 데이터만 DB에 저장
    • 이전 데이터는 Undo를 이용하여 저장
    • 데이터가 갱신되면 Undo 영역에는 이전 데이터블록들 값과 당시 SCN(System Commit Number) 저장
    • Select 조회 시 새로운 최신 SCN의 값을 가지며 이 SCN 값 이전 블록들 값을 읽게 됨
  • PostgreSQL
    • DB내에 다중 버전의 데이터를 저장
    • 더 이상 필요하지 않을 때 데이터를 정리 (=Vacuum)
    • DB내에 다중 버전 데이터 저장 -> 데이터가 많아져 파일 사이즈가 증가 -> 기존의 데이터는 삭제 표시가 생김

 

[ XID(트랜잭션 ID)란? ]

  • 트랜잭션이 발생한 시점을 식별하기 위한 정보
    • 트랜잭션이 일어날 때마다 하나씩 증가하며, MVCC 모델의 구현과 읽기 일관성을 위해 사용
  • PostgreSQL의 XID는 레코드(row) 단위로 할당하며 48Byte로 표현되며 최댓값은 약 43억이며 순환 구조로 되어있음
  • PostgreSQL에서 하나의 튜블은 xmin, xmax의 2개의 트랜잭션 ID를 가짐
  • Tuple이 생성된 시점은 xmin / Tuple이 삭제되는 (이전의 값)인 경우는 xmax로 XID를 저장
  • 다른 세션에서 해당 데이터를 조회 시 사용되는 XID가 xmin과 xmax 사이면 보임 
    • xmin과 xmax 사이가 아니면 보이지 않음
  • 수행시점의 XID와 레코드의 XID(XMIN)의 비교를 통해 MVCC구현
  • Wraparound를 피하기 위해 XID Age가 약 21억 넘어가기 전 해당 자료들의 XID를 Frozen XID라는 특수 값으로 표시하여 영구적인 과거 데이터임을 표시

 

[ PostgreSQL MVCC 특징]

  • 이전 버전의 데이터와 현재 버전의 데이터를 동일한 테이블 내 저장
  • 데이터 변경 시마다 이전 버전의 Tuple을 Expire 하고 현재 버전 데이터를 저장
  • 데이터 조회 중 트랜잭션 시작 이후에 변경된 값이 있을 경우, Expire 된 이전 버전 데이터를 조회
  • Update, Delete가 빈번한 테이블은 데이터들의 이전 버전을 모두 저장하므로 공간 비효율이 커지며, 스캔 범위가 늘어날 수 있음

 

[ Tuple Header 구조 ]

반응형

'IT > PostgreSQL' 카테고리의 다른 글

[ PostgreSQL ] PostgreSQL 설치  (0) 2025.02.28
[PostgreSQL] VACUUM이란?  (0) 2025.02.28
[PostgreSQL] PostgreSQL이란?  (0) 2025.02.21