Block Cleanout

Delayed block cleanout의 개념을 이해하려면 우선 오라클에서 사용하는 몇가지 용어에 대해 알아야 한다.

Cleanout 또는 block cleanout이란 블록에 설정된 로우 레벨 락을 해제(Cleanout)한다는 의미이다. Cleanout이 발생하면 로우 레벨 락이 해제되고 ITL 정보(SCN, Flag, Lock Byte 등)가 갱신된다.

Fast commit이란 커밋 시점에 모든 블록에 대해 cleanout을 수행하지 않는다는 것을 의미한다. 오라클은 성능상의 문제로 변경된 데이터 블록들 중 버퍼 캐시에 올라와 있는 일부 블록들에 대해서만 cleanout을 수행한다. Fast Commit이 발생하는 경우, 변경되는 정보의 량을 최소화하기 위해 ITL 정보에서 Flag와 SCN 정보만 변경되고 lock byte 정보는 변경되지 않는다. Lock byte 정보는 트랜잭션에 의해 변경된 모든 로우에 저장되므로 변경해야 할 데이터의 양이 많기 때문이다. Fast commit 기법은 변경된 일부 데이터 블록들의 헤더에 대해서만 변경 작업을 수행하기 때문에 리두 데이터가 생성되지 않고, 커밋 마크(Commit Mark)만이 리두에 저장된다. 수백만 건의 데이터를 변경한 후에 커밋을 수행하는 경우에도 매우 빠른 속도로 커밋 처리가 되는 것은 이러한 기법 덕분이다.

Delayed block cleanout이란 변경된 데이터 블록들 중 Fast commit에 의해 cleanout 되지 않은 블록들을 나중에(Delayed) cleanout 처리한다는 의미이다. Delayed block cleanout는 다음 번에 해당 블록을 스캔하는 프로세스에 의해 수행된다. Delayed block cleanout이 발생하는 경우 순수한 Select 작업인 경우에도 cleanout 작업 자체에 대한 리두 데이터가 생성될 수 있다.

커밋 수행(Fast commit)에 의해 cleanout이 수행되면 cleanout이 발생한 블록 수만큼 commit cleanouts 통계값이 증가한다. Cleanout을 수행하는 도중 에러가 발생하면 에러의 발생 원인에 따라 commit cleanout failures: xxxx 류의 통계값이 증가한다. Cleanout 수행에 성공한 경우에는 commit cleanouts successfully completed 통계값이 증가한다. 각 값들은 다음과 같은 관계를 따른다.

commit cleanouts = commit cleanouts successfully completed + 
Sum of (commit cleanout failures: xxxx)

user commits 통계값이 사용자가 커밋을 수행한 회수를 나타내는 반면 commit cleanouts 는 커밋에 의한 cleanout이 발생한 블록 수를 나타낸다는 사실에 유의하자.

Fast commit이 발생하면 ITL의 flag 값이 “U”(Upper Bound Commit)로 수정되고 SCN이 할당된다. 하지만 블록 내의 개별 로우의 lock byte값은 변경되지 않는다. 나중에 해당 블록을 다른 프로세스가 변경하는 경우에 flag 값이 “C”(Commit) 로 변경되고 블록 내의 개별 로우의 lock byte값도 정리(0의 값)된다.

'Oracle > Architecture' 카테고리의 다른 글

선 로그 기법  (0) 2012.05.15
Large Pool  (0) 2012.04.13
다중 Block SIZE  (0) 2012.04.12
SORT와 PGA_AGGREGATE_TARGET  (2) 2012.04.10
[Storage - 3] Segment  (0) 2012.01.27