h3.(1) 블럭 단위 I/O
① 오라클 에서는 I/O는 블럭 단위로 이루어져 있으며, 데이터파일 또는 메모리 버퍼 캐시에서 버퍼 블록을 액세스하거나,
DB 버퍼 캐시로 적재하거나 데이터파일에 저장할 때도 블록 단위로 처리한다
② 테이블 액세스시, Index를 경유한 경우 한번에 한 블럭씩(Single Block Reads) 읽어 들이지만 ,
Full Table Access시 한번에 여러개의 블럭(Multi Block Reads)을 읽어 들인다.
③ DBWR 프로세스는 버퍼 캐시로부터 변경된 블록(Dirty Buffer Block)을 주기적으로 데이터파일에 기록하는 작업을 수행하는데,
이때도 성능 향상을위해 한번에 여러 블록을처리한다.
④ 이와 같이 SQL성능 지표는 액세스하는 블럭 개수에 있으며, 옵티마이저가 실행계획을 수립하는데 가장 중요한 판단 기준은
읽고자하는 데이터의 레코드 수가 아닌 블럭의 수이다.
h3.(2) 버퍼 캐시 구조
① 오라클에서는 성능저하의 주요 원인이 되는 디스크I/O를 줄이기 위해 최근 사용된 블럭을 일정 메모리 영역에 저장해
두고 있는데 이 영역을 Buffer Cache라고 한다.
② DB Buffer Cache는 해시 알고리즘에 의해 해시 테이블 구조로 관리되는데 해시 버킷 -> 체인 -> 헤더 구조를 가진다.
③ DB버퍼 캐시 내에서 데이터 블록을 해싱하기 위해 사용되는 키 값은 데이터 블록 주소(DBA,Data Block Address)다
④ 해시 함수에 데이터 블록 주소를 입력해 리턴받은 해시 값(Hash Value) 이 같은 블록들을 같은 해시 버킷(Bucket)에
연결 리스트(Linked list) 구조로 연결하는 것이다. 각각의 연결 리스트를 해시 체인(Hash chain)이라고 한다.
h3.(3) 캐시 버퍼 체인
① 해시 체인은 래치(latch)에 의해 보호된다_ DB 벼퍼캐시는 공유 메모리 영역인 SGA 내에 존재하므로 여러 프로세스에 의한 동시
액세스가 일어날 가능성이 크다. 따라서 같은 리소스에 대한 액세스를 반드시 직렬화해야 하고,이를 위해 구현된 일종의 Lock
매커니즘을 래치(latch)라고 부른다.
② 두 개 이상의 프로세스가 같은 해시 체인으로 진입해 새로운 버퍼 블록을 연결하고 해제하는 작업을 동시에 진행한다면 문제가
발생할 수 있고, 이를 방지하기 위해 시용히는 것이 cache buffer chains 래치다.
(하나의 cache buffer chains 래치는 여러개의 해시체인을 관리한다.)
③ Oracle 9i부터 읽기 전용 작업일 때는 cache buffer chains 래치를 Share 모드로 획득할 수 있다. 읽기 전용 작업이란
select문을 의미하는 것이 아니라 해시 체인을 스캔하면서 필요한 블록을 찾는 작업을 말한다.
(하지만 실제 Select문에서 cache buffers chains 래치 경합이 여전히 발생한다.)
h3.(4) 캐시 버퍼 LRU 체인
① 메모리도 유한한 자원이기 때문에 버퍼 캐시가 사용빈도가 높은 데이더 블록들 위주로 구성될 수 있도록 LRU 알고리즘을 사용해 관리
- Free 버퍼가 필요해질 때마다 액세스 빈도가 낮은 데이터 블록들을 우선하여 밀어냄으로써 자주 액세스되는 블록들이 캐시에 더
오래 남아 있도록 관리하는 것
② LRU 리스트를 보호하기 위해 시용하는 래치를 cache buffers lru chain 래치
엑셈 - http://wiki.ex-em.com/index.php/Latch:_cache_buffers_chains
(LRU 알고리즘에 대해 설명이 잘되어 있어 첨부합니다.)