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만 증가함

문서에 대하여