h1.8. 블록 클린아웃

  • 블록 클린아웃(BIock Cleanout)은 트랜잭션에 의해 설정된 로우 Lock을 해제하고 블록 헤더에 커밋 정보를 기록하는 오퍼레이션이다.
  • 오라클에서 로우 단위 Lock은 레코드의 속성 (Lock Byte)으로 관리되며, 이는 로우 헤더로부터 블록 헤더에 있는 ITL 엔트리를 가리키는 포인터다.
  • 사용자가 트랜잭션을 커밋하면 블록 클린아웃까지 완료해야 완전한 커밋이라고 할 수있는데,
  • 대량의 갱신 작업이 있고 나서 커밋을 위해 해당 블록들을 일일이 찾아다니며 클린아웃을 수행하려면 시간이 오래 걸릴 수밖에 없다. 오라클은 그래서 대량의 갱신 작업이 있고 나서는 커밋 정보를 트랜잭션 테이블에만 기록하고 빠르게 커밋을 끝내 버린다.

h3.(1) Delayed 블록 클린아웃

  • 트랜잭션이 갱신한 블록 개수가 총 버퍼 캐시 블록 개수의 1/10을 초과할 때 시용하는 방식이다.
  • 커밋 이후 해당 블록을 액세스하는 첫번째 쿼리에 의해 클린아웃이 이루어지며, 이때 아래와 같은작업을수행한다.
  1. ITL 슬롯에 커밋 정보 저장
  2. 레코드에 기록된 Lock Byte 해제
  3. Online Redo에 Logging
  • 다른 트랜잭션이 발생시킨 변경사항에대한 커빗 정보가 아직 ITL에 기록되지 않았다면 읽기 전에 먼저 블록 클린아웃을 시도
    한다
    *ITL 슬롯에 기록된 트랜잭션 ID를 이용해 Undo 세그먼트 헤더에 있는 트랜잭션 테이블 슬롯을 찾아가 트랜잭션의 현재 상태를 확인하고 커밋된 트랜잭션이라면 이를 ITL 슬롯에 반영하고 로우 Lock 정보를 해제해 블록을 클린아웃

h3.(2) 커멋 클린아웃(= Fast 블록 클린아웃)

  • 만약 모든 클린아웃을 Delayed 블록 클린아웃 방식으로 처리한다면 select시에 블록을 클린아웃하는 일이 빈번히 발생한다
  • 블록 클린아웃도 쓰기 작업이므로 Current 블록에 작업을 수행해야 하며, RAC 또는 OPS 환경에서는 이를 위해 Exclusive 모드의 Current 블록을 요청하게 된다.

h3.(3) ITL과 블록 클린아웃

  • 패쓰