버퍼 Lock
① Cache Buffer Chain을 통해 데이터 블록을 액세스할 때 직렬화를 위해 Shared 모드로 획득한 래치를 풀고 Exclusive 모드로 접근해야 하며
이 때 'Buffer Lock'을 획득한다.
② 해시 체인 래치를 획득하고 버퍼를 찾았는데 'Buffer Lock'을 획득하지 못하여 대기할때는 대기자 목록(Waiter List)에 자신을 등록하고 래치는 해제한다.
이 때는 'buffer bust waits' 대기 이벤트가 발생한다.
③ 대기자 목록에서 기다리다가 'Buffer Lock'이 해제되면 'Buffer Lock'을 획득하고 작업을 진행한다.
④ 작업이 모두 끝나면 'Buffer Lock'을 바로 해제하지 않고 해당 버퍼가 속한 체인 래치를 다시 획득한 뒤 'Buffer Lock'을 해제한다.
Buffer Handle
① 'Buffer Lock'은 자신이 현재 해당 버퍼를 사용중임을 표시해 두는것으로, 'Buffer Pin'이라고도 하며, 변경시에는 하나의 프로세스만 Pin을
걸 수 있지만 읽기작업은 여러 프로세스가 동시에 Pin을 설정할 수 있다.
② 'Buffer Handle'이란 버퍼 헤더에 Pin을 설정하려고 사용하는 오브젝트를 지칭하며 버퍼 핸들을 얻어 버퍼 헤더에 있는 소유자 목록(Holder LIST)에
연결시키는 방식으로 Pin을 설정한다.
③ 버퍼 핸들을 얻으려면 래치가 필요한데 이 래치가 바로 'cache buffer handles' 이다.
④ 오라클은 각 프로세스마다 _db_handles_cached 개수만큼 버퍼 핸들을 미리 할당해주며 기본값은 5 이다.
⑤ 각 세션은 이를 캐싱하고 있다가 'Buffer Pin'을 할 때마다 사용하며, 추가로 필요할 때 'cache buffer handles' 래치를 얻고
추가로 버퍼 핸들을 할당받음
버퍼 Lock의 필요성
① 사용자가 데이터를 변경할 때 DML Lock을 통해 보호 받지만 오라클은 레코드 단위가 아닌 블록 단위로 I/O를 수행하므로
블록 단위의 Lock이 필요하다.
② Pin된 버퍼 블록은 'ALTER SYSTEM FLUSH BUFFER_CACHE;' 명령어를 사용하여 버퍼 캐시 전체를 비우려고 해도 밀려나지 않는다.
버퍼 Pinning
① 'Buffer Pinning'이란 버퍼를 읽고 나서 버퍼 Pin을 즉각 해제하지 않고 데이터베이스 Call이 진행되는 동안 유지하는 기능을 말함.
② 같은 블록을 반복적으로 읽을 때 'Buffer Pinning'을 통해 래치 획득 과정을 생략한다면 'Logical Reads' 횟수를 획기적으로 줄일 수 있다.
③ 일반적으로 'Buffer Pinning'은 인덱스를 스캔하면서 테이블을 액세스할 때의 인덱스 리프 블록.
'Index Range Scan' 하면서 인덱스와 테이블 블록을 교차 방문할 때 블록 I/O를 체크해보면, 테이블 블록에 대한 I/O만 증가함