오라클과 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 |
댓글