개요
Current Mode 읽기란, SQL 수행 중 실제 데이터 블록을 변경하거나 락을 걸어야 할 때 발생하는 읽기 모드를 의미합니다.
참고
•
SQL trace 에서의 명칭: current
•
tbSQL 의 autotrace 에서의 명칭 : db block gets
이는 SQL의 시작 시점이 아닌 실제로 블록에 액세스하는 시점의 최종값을 읽을 때 발생하며, 대표적으로 다음과 같은 상황에서 주로 나타납니다.
•
DML 수행 또는 디스크 정렬이 필요한 대용량 정렬 시
•
SELECT FOR UPDATE 구문 수행 시
•
Table Full Scan 시 대상 세그먼트의 익스텐트 정보를 읽을 때
방법
DML 수행
아래는 emp1 테이블에서 부서번호가 10번인 사원들의 급여를 100000만큼 증가시키는 DML문을 실행한 결과입니다.
SQL> set autot on
SQL> Update emp1 Set sal = sal + 100000 Where deptno = 10;
50000 rows updated.
SQL
복사
SQL ID: 7mcvyuswan8x3
Child number: 157
Plan hash value: 2110575394
Execution Plan
--------------------------------------------------------------------------------
1 UPDATE: EMP1 (Cost:101, %%CPU:0, Rows:49999)
2 INDEX (RANGE SCAN): IDX_EMP1_DEPTNO (Cost:101, %%CPU:0, Rows:49999)
Predicate Information
--------------------------------------------------------------------------------
2 - access: ("EMP1"."DEPTNO" = 10) (0.050)
NAME VALUE
-------------------- ---------
db block gets 111568
consistent gets 4895
physical reads 6894
redo size 16758760
sorts (disk) 0
sorts (memory) 5
rows processed 50000
SQL
복사
해당 쿼리의 경우, 먼저 deptno = 10인 데이터를 찾기 위해 일관성 모드(Consistent Mode)로 블록을 읽고, 실제 값을 변경하는 시점에 Current Mode로 동일한 블록을 다시 읽은 뒤, 해당 시점의 SAL 값에 100000을 더해 갱신합니다.
이때 발생하는 블록 읽기는 다음과 같이 나뉩니다.
•
deptno = 10 조건에 해당하는 데이터를 조회할 때 발생한 블록 읽기는 consistent gets에 기록됩니다.
•
실제 값을 변경하려고 블록을 다시 읽는 동작은 db block gets 항목에 표시됩니다.
추가로 이해해야 할 중요한 부분은 다음과 같습니다.
•
Consistent Mode로 데이터를 조회할 때는 블록 단위의 I/O가 발생하므로, 읽은 블록 수가 통계에 기록됩니다.
•
반면, Current Mode로 데이터를 읽을 때는 실제로 수정 대상 데이터를 찾기 위한 목적이므로,
수정 대상 건수와 읽은 블록 수가 비슷하게 나타나는 경향이 있습니다.
•
또한, db block gets 수치가 consistent gets보다 더 큰 값으로 나타날 수도 있습니다.
이러한 차이는 SQL의 실행 패턴과 I/O 방식의 특성에서 기인합니다.