[ 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 |