III. Touch Count Based Algorithm
1) Touch Count Based Algorithm
2) Touch Count Based LRU List 개요도
- 이 알고리즘은 LRU 리스트의 메인 리스트에서 사용한다.
– LRU 리스트의 메인 리스트는 크게 핫 영역(hot region)과 콜드 영역(cold region)으로 나누어 진다.
-- 자주 사용되는 블록은 핫 영역에 머무르며, 사용빈도가 낮은 블록은 콜드 영역에 머무른다.
-- 오라클은 개별 버퍼마다 터치 카운트를 관리하며, 프로세스에 의해 스캔이 이루어질 때마다 터치 카운트를 1씩 증가시킨다.
-- 프리 버퍼를 찾을 때 LRU 보조리스트를 검색한 후 없다면 메인 리스트의 콜드 영역 꼬리에서부터 프리 버퍼를 찾는다.
– LRU 끝에 있는 버퍼의 터치 카운트가 1 이하면서 프리 상태일 경우 프리 버퍼로 사용되고 터치 카운트가 2 이상인 블록은 핫 영역의 머리 부분으로 옮겨지고 터치 카운트는 0으로 초기화 된다.
3) Touch Count Based LRU List 개요
- Block Header는 Touch Count와 Timestamp 정보 관리
- Block 에 3초 이후에 다시 Access하면 Touch Count가 증가
- Free Buffer Scan시에 Touch Count가 2 이상인 Block은 Hot End로 이동
- 만약 2 미만이면 Free Buffer로 이용됨
- 새로 Cache되는 Block은 Mid Point (Cold End)로 삽입
Touch Count Based Algorithm 관련 Parameter
- _DB_PERCENT_HOT_DEFAULT : 핫 영역의 크기를 %로 설정
- _DB_AGING_FREEZE_CR : CR 블록이 핫 영역으로 이동을 막음 불린(boolean)값 설정
- _DB_AGING_COOL_COUNT : 핫 영역의 블록이 콜드 영역으로 이동할 경우 touch count 초기화 값
- _DB_AGING_TOUCH_TIME : 터치 카운트 증가 주기 시간, 터치 카운트 증가 후 3초(기본값) 이후에 접근할 경우 터치 카운트 1 증가
- _DB_AGING_HOT_CRITERIA : 프리 버퍼로 사용할 버퍼 검색 시 핫 영역으로 이동할 수 있는 터치 카운트 크기
- _DB_AGING_STAY_COUNT : 핫 영역의 머리로 이동 시 터치 카운트 리셋 값
위의 파라미터들은 오라클 히든 파라미터 이므로 수정 시 성능문제를 유발할 수 있으므로 주의한다.
4) Consistent Read에서의 Touch Count
프로세스가 일관성 읽기(consistent read)를 하기 위해서는 해당 블록의 과거 이미지를 가지고 있는 CR 블록(consistent read block)이 필요하다.
슬라이드 내용
- 원하는 블록이 버퍼에 현재 SCN 버전인 상태로만 존재할 경우 CR 블록을 생성하기 위한 프리 버퍼가 필요하므로 LRU 리스트 꼬리에서 프리 버퍼를 검색한다.
- 현재 버퍼에 있는 current 블록을 새로운 버퍼에 복사(CR copy) 한다.
- CR 블록을 만들기 위해 언두(undo)를 적용 시켜 이전 시점의 SCN 정보를 반영한다.
5) Single Block Read에서의 Touch Count
슬라이드 내용
- 싱글 블록 I/O가 발생하게 되면 먼저 버퍼에 블록이 존재하는지 검색한다.
- 버퍼 내에 블록이 존재 한다면 해당 버퍼에 대해 터치 카운트를 증가시키고 존재하지 않는다면 블록을 버퍼에 올리기 위해 LRU 리스트를 검색한다.
- 이때 터치카운트가 1 이하 이고 프리한 상태의 버퍼에 블록을 적재하고 LRU 리스트의 mid-point인 콜드 영역의 머리 부분에 삽입 한다.
- 만약 콜드 영역의 꼬리에 있는 버퍼의 터치 카운트가 2 이상이면 핫 영역의 머리 부분으로 이동시킨 후 터치 카운트를 0으로 초기화한다.
- 다른 블록들은 콜드 영역 방향으로 한 칸씩 밀려나게 된다.
6) Multi Block Read에서의 Touch Count
슬라이드 내용
- 멀티 블록 I/O로 읽을 경우 오라클은 한번에 블록을 DB_FILE_MULTIBLOCK_READ_COUNT의 크기 만큼 읽게 된다.
- 예를 들어 DB_FILE_MULTIBLOCK_READ_COUNT가 4일 경우 LRU 리스트의 꼬리에서 4개의 블록을 찾는다.
- 블록을 버퍼에 적재한 후 LRU 콜드 영역의 머리에 위치 시킨다.
- 4개의 버퍼를 차례대로 읽으면서 읽은 버퍼는 다시 콜드 영역의 꼬리 쪽으로 보내진다.
- 다음 멀티 블록 I/O를 위해 다시 콜드 영역의 꼬리에서 프리 버퍼를 검색한다. 이때 전에 꼬리로 이동된 사용했던 버퍼들을 재사용 하게 된다.
- 이 작업을 멀티 블록 I/O 동안 반복하게 되므로 다량의 멀티 블록 I/O가 발생해도 일정 수 만의 버퍼만 사용하게 된다.
문서에 대하여
- 최초작성자 : 황종필
- 최초작성일 : 2010년 09월 18일
- 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
- {*}이 문서의 내용은 (주)엑셈에서 출간한 'PRACTICAL OWI IN ORACLE 10G'를 참고하였습니다.*