메뉴 건너뛰기

Korea Oracle User Group

Admin

Block Cleanout(블럭 클린아웃)

명품관 2016.09.23 15:56 조회 수 : 131

Block Cleanout(블럭 클린아웃)

트랜잭션에 의해 설정된 로우 Lock을 해제하고 블럭 헤더에 커밋 정보를 기록하는 오퍼레이션을 말함. 사용자가 트랜잭션을 커밋하면 블럭 클린아웃까지 완료해야 완전한 커밋이라할 수 있을 것이다. 하지만 대량 작업 후 커밋을 위해 모든 대상 블럭을 찾아가면서 클린아웃 시키려면 시간이 오래 걸릴 것이다. 그래서 대량 작업 후 커밋 정보를 트랜잭션 테이블에만 기록하고 빠르게 커밋을 끝낸다. 블럭 클린아웃의 시점은? Delayed 블럭 클린아웃, 커밋 클린아웃 두가지 방식을 사용하므로 두가지의 경에 블럭 클린아웃 시점이 달라진다.

Delayed 블럭 클린아웃

트랜잭션이 갱신한 블럭 개수가 총 버퍼 캐시 블록 개수의 1/10을 초과할 때 사용하는 방식.

커밋 이후 해당 블럭을 액세스하는 첫 번째 쿼리에 의해 클린아웃이 수행된다. 

아래 작업을 수행하면서 이루어진다.

 

1) ITL 슬롯에 커밋 정보 저장

2) 레코드에 기록된 Lock Byte 해제

3) Online Redo에 Logging

 

블럭을 읽는 과정에서 Active 생태의 블럭, 즉 다른 트랜잭션이 밸생시킨 변경사항에 대한 커밋 정보가 아직 ITL에 기록되지 않았다면 읽기 전에 먼저 블럭 클린아웃을 시도한다. ITL 슬롯에 기록된 트랜잭션 ID를 이용해 Undo 세그먼트 헤더에 있는 트랜잭션 테이블 슬롯을 찾아가 트랜잭션의 현재 상태를 확인하고 커밋된 트랜잭셔이라면 이를 ITL 슬롯에 반영하고 로우 Lock 정보를 해제해 블럭을 클린아웃시킨다. 블럭 클린아웃을 위한 갱신내용도 Redo에 로깅하며, 블럭 SCN도 변경한다.

커밋 클린아웃(Fast 블럭 클린아웃)

트랜잭션이 갱신한 블럭 개수가 버퍼 캐시 블럭 개수의 1/10을 초과하지 않을 때는 커밋 시점에 곧바로 블럭 클린아웃을 수행한다. 다만, 이 경우에도 커밋 시점에는 불완전한 형태의 클릿아웃을 수행하며 해당 블럭을 갱신하는 다음 트랜잭션에 의해 완전한 클린아웃이 이루어진다.

실제 커밋 시점에는 ITL 슬롯에 커밋 정보만 저장하고 로우 헤더에 기록된 Lock Byte는 해제하지 않는다. 커밋 시점에 이미 완전한 커밋 정보가 ITL에 기록돼있기 때문에 이후 CR 모드 읽기 시 커밋 여부와 커밋 SCN을 확인하려고 트랜잭션 테이블을 조회하지 않아도 되며, Lock Byte를 무시하고 그대로 블럭을 읽는다.

ITL 슬롯에 커밋 정보를 저장하면서 Lock Byte를 해제하지 않고 그대로 두는 이유는 로깅을 수해하지 않기 위해서다. 즉, 커밋 클린아웃 시에는 Online Redo에 로그를 남기지 않는다. 로깅 시점을 뒤로 미루는 것이다. 그러고 나서 해당 블록을 갱신하려고 Current 모드로 읽는 시점에(ITL 슬롯이 필요해지므로) 비로서 Lock Byte를 해제하고 완전한 클린아웃을 수행한다. 그리고 그 내역을 Online Redo에 로긴한다. 블럭 클린아웃 정보를 나중에 로깅하다는 의미에서 이를 'Delayed 로깅 블럭 클린아웃' 이라고 부른다.

 

 

참고 : 오라클 성능 고도화 원리와 해법1(조시형 저)

위로