[Oracle] Consistent Read(CR) / Current Read(CU)

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은 다음 과정을 거칩니다
    1. 버퍼 캐시에서 해당 데이터 블록을 읽음
    2. 만약 해당 블록이 다른 트랜잭션에 의해 변경 중(Dirty)이라면,
      → UNDO 세그먼트를 참고하여 과거 시점의 블록 이미지(consistent version) 를 생성
    3. 이 복원된 블록(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