본문 바로가기

Oracle/Admin

[Oracle] 블록 클린아웃

728x90

블록 클린아웃은 트랜잭션에 의해 설정된 로우 Lock을 해제하고 블록 헤더에 커밋 정보를 기록하는 오퍼레이션이다.

대량의 갱신 작업이 있고 나서는 해당 블록들을 일일이 찾아 다니며 클린아웃을 수행하려면 시간이 오래 걸려 오라클은 대량 갱신 작업 후에는 커밋 정보를 트랜잭션 테이블에만 기록하고 커밋을 빠르게 끝낸다.

 

항상 이 방식으로 작동하는것은 아니며, 오라클은 delayed 블록 클린 아웃과 커밋 클린아웃 두 가지 매커니즘을 사용한다.

 

(1) Delayed 블록 클린아웃

트랜잭션이 갱신한 블록 개수가 총 버퍼 캐시 블록 개수의 1/10을 초과할 때 사용하는 방식이다. 커밋 이후 해당 블록을 액세스하는 첫 번째 쿼리에 의해 클린아웃이 이루어지며, 이때 아래와 같은 작업을 수행한다.

 

1. ITL 슬롯에 커밋 정보 저장 --> active 상태의 블록이, 다른 트랜잭션이 변경 시킨 사항이 ITL에 아직 기록되지 않았다면 ITL슬롯에 기록된 트랜잭션 ID를 이용해 undo 세그먼트 헤더에 있는 트랜잭션 테이블 슬롯을 찾아가 현재 상태를 확인하고 커밋된 상태면 이를 ITL슬롯에 반영.

2. 레코드에 기록된 lock byte 해제

3. online redo에 logging

 

(2) 커밋 클린아웃(=fast 블록 클린아웃) 

트랜잭션이 갱신한 블록 개수가 버퍼 캐시 블록 개수의 1/10을 초과하지 않을때는 커밋 시점에 곧바로 블록 클린아웃을 수행한다.

다만, 이 경우에도 커밋 시점에는 '불완전한 형태의 클린아웃'을 수행하며 해당 블록을 갱신하는 다음 트랜잭션에 의해 완전한 클린아웃이 이루어진다.

 

ITL 슬롯에 커밋 정보만 저장하고 로우 헤더의 lock byte는 해제하지 않는다. 

 

즉 커밋 클린아웃시에는 online redo에 로그를 남기지 않는다. 로깅 시점을 미룸

그러고 나서 해당 블록을 갱신하려고 currnt 모드로 읽는 시점에 비로소 lock byte를 해제하고 완전한 클린아웃을 수행함.

그리고 그 내역을 online redo 에 로깅. 이를 delayed 로깅 블록 클린 아웃이라고 부름.

728x90
반응형