728x90
개념 요약
| 구분 | Consistent Read(CR) | Current Read(CU) |
| 역할 | 조건 평가용 읽기 (undo 기반 일관성 보장) | 데이터 수정용 읽기 (버퍼 캐시의 최신 블록) |
| 발생 시점 | SELECT, UPDATE/DELETE의 WHERE 절 평가 시 | UPDATE/DELETE/INSERT의 실제 DML 변경 시 |
| 블록 버전 | 변경 전 버전 (old image) | 변경 후 버전 (new image) |
| I/O 발생 가능성 | UNDO 블록을 읽을 수 있어 디스크 I/O 증가 가능 | 보통 캐시 내에서 수행 (I/O 적음) |
| 주요 통계 항목 | consistent gets | db block gets |
처리 과정 비교
(1) Consistent Read (CR)
- DML 수행 시, 트랜잭션 격리를 위해 커밋되지 않은 변경을 보지 않도록 처리합니다.
- 따라서 Oracle은 다음 과정을 거칩니다
- 버퍼 캐시에서 해당 데이터 블록을 읽음
- 만약 해당 블록이 다른 트랜잭션에 의해 변경 중(Dirty)이라면,
→ UNDO 세그먼트를 참고하여 과거 시점의 블록 이미지(consistent version) 를 생성 - 이 복원된 블록(CR Block)을 읽어 결과를 반환
CR Block (Consistent Read Block)
→ "쿼리 시작 시점의 데이터 상태를 복원한 블록"
Oracle이 Undo 정보를 이용해 원본 블록의 과거 상태를 재구성한 결과물
(2) Current Read (CU)
- DML 문 (UPDATE, DELETE, INSERT)을 수행할 때 Oracle은
현재 버전의 블록을 직접 수정해야 하므로,
버퍼 캐시에 있는 최신 블록을 그대로 읽습니다.
SELECT 문 내부 동작 예시
SELECT * FROM emp WHERE deptno = 10;
(1) Consistent Read 단계
- WHERE deptno = 10 조건을 평가하기 위해
각 블록을 쿼리 시작 시점의 일관된 상태(undo 기반) 으로 읽음 - 이때 발생하는 블록 접근이 consistent gets
UPDATE 문 내부 동작 예시
Consistent Read(CR)는 SELECT 문뿐 아니라 UPDATE/DELETE 문에서도 발생합니다.
SELECT 전용 메커니즘이 아니라, 조건(Where 절 이하)을 평가하기 위한 읽기(consistent view)가 필요할 때마다 사용되는 읽기 방식이에요.
Oracle에서 SQL이 데이터를 읽는 과정은 두 단계로 나눌 수 있습니다.
| 단계 | 목적 | 읽기 유형 |
| ① 조건 평가 단계 (predicate evaluation) | WHERE 절 조건을 만족하는 행 찾기 | Consistent Read |
| ② 데이터 수정 단계 (modification phase) | UPDATE/DELETE 등의 실제 블록 변경 | Current Read |
즉, DML도 내부적으로는 먼저 Consistent Read로 대상 행을 찾고,
그다음에 Current Read로 해당 블록을 수정합니다.
예를 들어 아래 SQL을 실행한다고 해보죠
UPDATE emp SET sal = sal * 1.1 WHERE deptno = 10;
Oracle 내부에서는 다음과 같은 순서로 동작합니다.
(1) Consistent Read 단계
- WHERE deptno = 10 조건을 평가하기 위해 각 블록을 쿼리 시작 시점의 일관된 상태(undo 기반) 으로 읽음
- Oracle은 deptno = 10 인 행을 찾기 위해 데이터를 읽습니다.
- 하지만 동시에 다른 트랜잭션이 emp 테이블을 수정 중일 수도 있죠.
- 그래서 Oracle은 UNDO를 이용해서 “쿼리 시작 시점”의 상태로 복원된 블록(CR Block)을 읽습니다.
- 이때 발생하는 블록 접근이 consistent gets
(2) Current Read 단계
- 조건을 만족한 행이 속한 블록을 버퍼 캐시에서 최신 상태로 가져옴
- 실제 sal 값을 수정
- 변경된 블록을 redo/undo 버퍼에 기록
- 이때 발생하는 블록 접근이 db block gets
3. 통계와 관련된 뷰
| 항목 | 의미 |
| consistent gets | 일관된 읽기를 위해 블록을 읽은 횟수 (CR) |
| db block gets | 현재 버전 블록을 읽은 횟수 (CU) |
| v$sesstat / v$sysstat | 세션별·시스템별 블록 접근 통계 확인 가능 |
| v$bh | 버퍼 캐시에 어떤 블록들이 어떤 상태로 있는지 확인 가능 |
4. 예시로 보는 Autotrace 출력
SET AUTOTRACE ON STATISTICS
SELECT * FROM emp WHERE deptno = 10;
출력 예:
consistent gets = 25
db block gets = 0
→ SELECT만 수행했기 때문에 undo 기반 consistent read만 발생.
UPDATE emp SET sal = sal * 1.1 WHERE deptno = 10;
출력 예:
consistent gets = 25
db block gets = 5
→ CR 블록을 찾아 조건을 확인한 뒤,
→ CU 블록(현재 버전)을 5개 수정했음을 의미.
→ 25개의 블록은 WHERE 조건을 만족하는지 확인하기 위해 CR로 읽은 것,
→ 5개의 블록은 UPDATE 수행을 위해 CU로 읽은 것입니다.
5. DML별 블록 읽기 패턴
| 명령어 | Consistent Read(CR) | Current Read(CU) | 설명 |
| SELECT | ✅ 있음 | ❌ 없음 | 읽기만 수행 |
| INSERT | ❌ 없음 | ✅ 있음 | 새 블록에 기록 |
| UPDATE | ✅ (조건 확인) | ✅ (수정 시) | 둘 다 발생 |
| DELETE | ✅ (조건 확인) | ✅ (삭제 마킹 시) | 둘 다 발생 |
| MERGE | ✅ (매칭 확인) | ✅ (삽입/갱신 시) | 둘 다 발생 |
728x90
'📁 Database > Oracle' 카테고리의 다른 글
| [Oracle] DBA_HIST_ACTIVE_SESS_HISTORY (ASH의 과거 데이터) (0) | 2025.11.28 |
|---|---|
| [Oracle] ORA-08177: can't serialize access for this transaction (0) | 2025.11.17 |
| [Oracle] 쿼리 수행 후 실행 통계 확인 (SET AUTOTRACE ON STATISTICS) (0) | 2025.11.13 |
| [Oracle] Lock과 Latch (0) | 2025.11.12 |
| [Oracle] 아카이브 로그의 최소 보관 주기 (0) | 2025.11.12 |