Database Buffer Cache 는 크게 두가지의 이슈를 지닌다.
1. Organization of Database Buffer Cache
2. LRU 알고리즘 과 Full Table Scans
2. LRU 알고리즘 과 Full Table Scans
1. Organization of Database Buffer Cache
cache 안의 버퍼들은 두가지 종류로 나뉘어진다.
1) write list
2) least recently used (LRU) 최근에 사용된 list
write list 는 수정되었지만 아직 disk 에 쓰여지지 않은 dirty buffers 를 가지고 있고
LRU list 는 free buffers 와 pinned buffers 그리고 disk 에 쓰여지지 않은 수정된 버퍼인
dirty buffers 를 가지고 있다.
free buffers 는 어떠한 사용가능한 데이터를 가지고 있지 않고, 사용될수 있는 공간이다.
pinned buffers 는 현재 접근중인 ( 변경중인 ) 버퍼이다.
Oracle Database process 가 buffer 에 access 할시 process 는 buffer 를 MRU 로 이동시키고,
dirty buffer 는 시간이 지날수록 LRU list 의 끝으로 가게 된다.
첫번째로 Oracle user process 는 Database buffer cache 에서 찾고자 하는 데이터를 찾는다.
만약 데이터가 cache에 있다면 (cache hit) 메모리에서 데이터를 바로 읽어 들인다.
하지만 데이터가 cache에 없다면 (cache miss) , disk 에서 data block을 메모리로 copy 해야한다.
data block 을 cache 에서 read 하기전에 process 는 free buffer 를 찾게 된다.
process 는 LRU list 에서 free buffer 를 찾게 되는데, LRU 부분에서 부터 검색을 시작한다.
process 는 free buffer 또는 buffer 의 한계가 검색 되었을때 둘다 검색을 하게 되는데,
검색시 dirty buffer 를 LRU list 에서 찾게 된다면, dirty buffer 는 disk 에 write 하고 검색을 재개한다.
process 가 free buffer 를 찾으면, disk 에서 data block 을 메모리로 올려 free buffer 에 copy 하고,
MRU로 이동 시킨다.
만일 process가 buffer 가 꽉찾다고 감지하게 된다면 free buffer 검색을 중단하고, DBWn 에 의하여
dirty buffer 를 disk 로 write 한다.
1) write list
2) least recently used (LRU) 최근에 사용된 list
write list 는 수정되었지만 아직 disk 에 쓰여지지 않은 dirty buffers 를 가지고 있고
LRU list 는 free buffers 와 pinned buffers 그리고 disk 에 쓰여지지 않은 수정된 버퍼인
dirty buffers 를 가지고 있다.
free buffers 는 어떠한 사용가능한 데이터를 가지고 있지 않고, 사용될수 있는 공간이다.
pinned buffers 는 현재 접근중인 ( 변경중인 ) 버퍼이다.
Oracle Database process 가 buffer 에 access 할시 process 는 buffer 를 MRU 로 이동시키고,
dirty buffer 는 시간이 지날수록 LRU list 의 끝으로 가게 된다.
첫번째로 Oracle user process 는 Database buffer cache 에서 찾고자 하는 데이터를 찾는다.
만약 데이터가 cache에 있다면 (cache hit) 메모리에서 데이터를 바로 읽어 들인다.
하지만 데이터가 cache에 없다면 (cache miss) , disk 에서 data block을 메모리로 copy 해야한다.
data block 을 cache 에서 read 하기전에 process 는 free buffer 를 찾게 된다.
process 는 LRU list 에서 free buffer 를 찾게 되는데, LRU 부분에서 부터 검색을 시작한다.
process 는 free buffer 또는 buffer 의 한계가 검색 되었을때 둘다 검색을 하게 되는데,
검색시 dirty buffer 를 LRU list 에서 찾게 된다면, dirty buffer 는 disk 에 write 하고 검색을 재개한다.
process 가 free buffer 를 찾으면, disk 에서 data block 을 메모리로 올려 free buffer 에 copy 하고,
MRU로 이동 시킨다.
만일 process가 buffer 가 꽉찾다고 감지하게 된다면 free buffer 검색을 중단하고, DBWn 에 의하여
dirty buffer 를 disk 로 write 한다.
2. LRU 알고리즘 과 Full Table Scans
user process 가 full table scan 을 하게 된다면, disk 에서 data block을 읽여들여
MRU 대신에 LRU 리스트의 끝으로 이동하게 된다.
그 이유는 full table scan 시 오랬동안 사용되는 경우가 드물기 때문에 (오직 적은 용도로만 사용)
되도록이면 빨리 cache 에서 out 되야 하기 때문이다.
oracle 에서는 직접 full table scan 시에 cache 에서 취할 다른 행동을 정의할수 있다. (cache hint)
CACHE Hint
CACHE hint는 full table scan이 수행됐을 때 hint에 있는 테이블에 대해 retrieve된 블록들은 버퍼 캐시에 있는 LRU list의 가장최근(most recently)에 사용되어진 것의 끝에 위치
이 option은 small lookup table에 유용하다. CACHE hint는 테이블의 default caching specification을 무시
SELECT/*+ FULL (scoot_emp) CACHE(scott_emp) */ ename
FROM scott.emp scott_emp;
NOCACHE
NOCACHE hint는 full table scan이 수행됐을 때 hint에 있는 테이블에 대해 retrieve된 블록들은 버퍼 캐시에 있는 LRU list의 가장 오래전(least recently)에 사용되어진 것의 끝에 위치
버퍼캐수에 blocks의 일반적인 행동
SELECT/*+ FULL (scoot_emp) NOCACHE(scott_emp) */ ename
FROM scott.emp scott_emp;cache 참조 문서
more..
댓글 없음:
댓글 쓰기