SQL

Oracle과 PostgreSQL의 MVCC 구현 방식 차이

class="song" 2026. 11. 1.

오라클과 postgre의 가장 결정적인 차이는 데이터가 수정될 때 과거 데이터를 어디에, 어떻게 보관하느냐(MVCC 구현 방식)에 있다

MVCC(다중 버전 동시성 제어) 구현 방식의 차이

두 DB 모두 읽기 작업이 쓰기 작업을 차단하지 않도록 하기 위해 MVCC를 사용하지만, 내부 구조가 완전히 다르다

  • 오라클(Undo Segment 방식)

    • 데이터를 수정하면 기존 디스크 위치의 데이터를 직접 덮어씀

    • 수정되기 전의 과거 데이터는 Undo Segment라는 공간으로 밀려남

    • Consistent Read(CR 모드)와 Current Read(Current 모드)

      • Cosistent Read

        • select 문이 시작된 시점의 SCN을 기준으로 데이터를 읽음
        • 캐시의 올라온 블록의 SCN이 쿼리 시작 SCN보다 최신이라면,
          오라클은 원본 블록을 건드리지 않고 Undo 세그먼트에서 과거 데이터를 가져와,
          메모리 상에 CR 블록(복제본)을 동적으로 생성하여 읽음
        • 이 방식으로 Reader와 Writer는 블로킹하지 않음
      • Current Read

        • DML을 수행할 때는 다름
        • 데이터를 변경하기 위해서는 과거 시점이 아니라 가장 최신에 커밋된 실제 블록을 읽고 락을 걸어야 함
        • 먼저 Consistent방식으로 조회 후 조건에 맞은 블록을 Current 모드로 다시 읽고 작업을 실시함
  • PostgreSQL(xmin/xmax와 EPQ(EvalPlanQual)
    • 하나의 테이블(페이지) 안에 과거 데이터와 현재 데이터가 공존하며, 트랜잭션의 Snapshot을 통해 가시성을 판단함
    • Cosistent Read의 구현(Snapshot + xmin/xmax)
      • 오라클의 SCN 대신, 트랜잭션 시작 시점의 Snapshot(현재 활성화된 트랜잭션 ID 목록)을 가져옴
      • 테이블을 스캔할 때 각 튜플 헤얻에 적힌 xmin(생성한 TX ID)과 xmax(삭제/수정한 TX ID)를 자신의 Snapshot과 비교
      • 자신의 Snapshot 기준으로 아직 커밋되지 않았거나 내 쿼리 시작 이후에 변경된 튜플은 무시하고,
        이전 버전의 튜플을 취사선택하여 읽음으로써 Consistent Read를 달성
    • Current Read의 구현(EPQ - EvalPlanQual)
      • Read Committed 격리 수준에서는 락 대기 후 상대방이 커밋하면 EPQ라는 메커니즘을 발동
      • EPQ는 업데이트된 최신 버전의 튜플을 다시 가져와서 where 조건에 여전히 부합하는지 재평가한 후 변경을 수행

구조적 차이가 가져오는 트레이드오프

- 오라클의 약점
    - CR 블록을 만들기 위해 다량의 Undo를 뒤지면 논리적 I/O가 폭증
    - Undo 덮어쓰기가 발생하면 Snapshot too old 에러 발생
- PostgreSQL의 약점
    - CR 블록 생성 비용은 없지만 하나의 페이지에 쓸모없는 과거 데이터(Dead Tuple)가 계속 쌓임
    - select 시 인덱스 온리 스캔이 아니라면 Dead Tuple들을 일일이 읽고 버리는(가시성 판단) 오버헤드 발생
    - 따라서 Dead Tuple을 정리하는 VACCUM 작업과 튜닝이 오라클의 Undo 관리 이상으로 DB 성능을 좌우함

'SQL' 카테고리의 다른 글

Oracle, postgreSQL 비교  (0) 2026.11.01
RHEL 8에 PostgreSQL 설치하기  (0) 2026.11.01
[Oracle] DB 서버의 구조  (0) 2026.07.27
[Oracle] 오브젝트 정리  (1) 2026.02.23
[오라클] Catalog, 통계정보, Undo Retention  (0) 2026.02.19

댓글