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