3. 버퍼 Lock

조회 수 5995 추천 수 0 2013.08.21 12:33:51
휘휘 *.168.123.1

1. 버퍼 Lock 이란?   -  자신이 현재 그 버퍼를 사용 중임을 표시 (버퍼 헤더에 Pin 설정)

  • 두 개 이상의 프로세스가 동시에 버퍼 내용을 읽고 쓴다면 문제가 발생
    • 캐쉬된 버퍼 블록을 읽거나 변경하려는 프로세스는 버퍼헤더로부터 버퍼 Lock 획득
    • 버퍼 Lock 획득 후 래치 해제 → 다른 안정장치(버퍼Lock) 획득으로 안심하고 블록 Read/Write
  • 모드
    • Share 모드 : 버퍼 내용을 읽기만 할 때 사용
    • Exclusive 모드 : 버퍼 내용을 변경 할 때 사용 (Exclusive Lock 은 한 시점에 하나의 프로세스만 얻음)
Select 문도 블록 클린아웃이 필요할 시 버퍼 내용을 변경하는 작업으로 Exclusive 모드 사용 가능
  • 래치 획득후 다른 프로세스가 Exclusive 모드의 버퍼 Lock 으로 내용 갱신 중일 시
    1. 버퍼 헤더에 있는 버퍼 Lock 대기자 목록(Waiter List)에 등록 후 래치 해제
    2. 버퍼 Lock 대기자 목록에 등록되어 있는 동안 Buffer busy waits 대기 이벤트 발생
    3. 사용 중인 버퍼 Lock가 해제되면 대기자 목록의 프로세스가 버퍼 Lock 획득 후 작업 진행
    4. 작업 완료 후 체인 래치를 재 획득 (버퍼 헤더 액세스 시 다른 프로세스와 충돌 방지)
    5. 버퍼 Lock 해제
    6. 래치 해제
※ 작업 블록이 버퍼 캐시에 없을 시 디스크 I/O 수행
  • 참 고
    • 조나단 루이스 曰
      • 버퍼 블록 읽을 시 대부분 두 번의 래치 획득 - 버퍼를 찾아 Pin / Pin 해제
      • 몇몇 오퍼레이션에서는 래치를 쥔 채 버퍼 블록 읽어 한 번의 래치 획득
      • v$sysstat 뷰에서 consistent gets - examination 통계항목에서 측정



2. 버퍼 핸들   버퍼 헤더에 Pin을 설정하려고 사용하는 오브젝트 ?

* 버퍼 Pin: 버퍼 Lock의 다른말 (Pined 버퍼)


- 변경 시(Exclusive 모드) 하나의 프로세스만 Pin 설정 가능

- 읽기 시(Share 모드) 여러 개 프로세스 동시 Pin 설정 가능

  • Pin 설정
    • 버퍼 핸들을 얻어 버퍼 해더에 있는 소유자 목록(Holder List)에 연결
  • 버퍼 핸들 획득
    • 버퍼 핸들은 공유된 리소스로 경합을 위해 또 다른 래치 필요 ☞ cache buffer handles 래치
    • 각 프로세스 마다 _db_handles_cached 개수만큼 버퍼 핸들 미리 할당 (default : 5개)
    • 각 세션은 이를 캐싱 하고 있다가 버퍼 Pin 적용 시 사용
    • 그 이상의 버퍼 핸들 필요 시 cache buffer handles 래치를 얻고 추가 버퍼 핸들 할당받음
  • 시스템 전체적 사용 가능한 총 버퍼 핸들 개수
    • _db_handles 파라미터 값 = processes 파라미터 값 x _db_handles_cached 파라미터 값



3. 버퍼 Lock의 필요성 

  • 사용자 데이터 변경 시 DML Lock과 다른 Lock 획득

∵ 하나의 레코드 갱신도 블록 단위로 I/O를 수행


  • 필요성
    • 값 변경 전 레코드에 로우 단위로 Lock 설정 (레코드의 속성 변경 작업)
    • 두 개의 프로세스가 동시에 로우 단위 Lock을 설정하려고 할 시 문제 발생
    • 블 록 SCN 변경 또는 ITL 슬롯에 변경을 가하는 블록 헤더 내용 변경 작업이 동시에 발생 할 시
    • Lost Update 문제가 생겨 블록 자체의 정합성이 깨짐
∴ 블록 자체로의 진입 직렬화 필요


  • 참고
    • Pined 버퍼 블록의 버퍼 캐시 전체가 비워지지 않음
alter system flush buffer_cache;
    • 9i 에서는 비공식적으로 버커 캐시가 지워짐
alter system set events 'immediate trace name flush_cache';



4. 버퍼 Pinning  -  버퍼 읽기 후 버퍼 Pin을 바로 해제하지 않고 데이터 베이스 Call 진행동안 유지

  • 장점
같은 블록을 반복적으로 읽을 시 버퍼 Pinning을 통해 래치 획득 과정 생략으로
논리적인 블록 읽기 횟수 감소


  • 사용 대상

모든 버퍼 블록에 버퍼 Pinning을 적용하지 않고

같은 블록을 재방문할 가능성이 큰 몇몇 오퍼레이션 수행 시 사용


  • 확 인

v$sysstat. v$sesstat, v$mystat 등 조회,

래치 획득 과정을 통해 블록 액세스 시 session logical reads 항목 증가

래치 획득 과정 없이 버퍼 Pinning을 통해 블록을 곧바로 액세스 시 buffer is prinned count 항목 수치 증가


  • 특 징
    • 버퍼 Pinning 은 하나의 데이터베이스 Call 내에서만 유효
    • 버퍼 Pinning 적용 지점은 인덱스를 스캔하면서 테이블을 액세스 할 시 인덱스 리프 블록

☞ Index Range Scan 시 인덱스와 테이블 블록 교차 방문 시

    블록 I/O 체크 시  테이블 블록 I/O만 계속 증가


  • 참 고

- 클러스터링 팩터가 좋다 = 인덱스 레코드가 가리키는 테이블 rowid 정렬 순서가 인덱스 키 값 정렬 순서와 거의 일치

   ☞ 클러스터링 팩터가 좋을 수록 논리적 블록 읽기 횟수가 적게 나타남


- 오라클 버전이 올라갈 수록 버퍼 Pinning 적용하는 지점을 점차 확대

   (11g)

    1. NL 조인 시 Inner 테이블의 인덱스 루트 블록 뿐 아니라 다른 인덱스 블록에 대해서도 Pinning 적용

    2. DML 수행 시 Undo 블록에 대해서도 Pinning 적용



     ※ 버퍼 Pinning을 통한 블록 I/O 감소 효과는 SQL 튜닝하는데 있어 중요

     ※ 인덱스 클러스터링 팩터와 관련 (버퍼 Pinning 원리 사용)

         → (예) 액세스 빈도가 높은 인덱스 키 순서대로 테이블 레코드 재정렬





profile

휘휘

2010.05.26 22:39:11
*.168.123.1

* hidden parameter 확인 방법


select a.ksppinm, b.ksppstvl
from x$ksppi a, x$ksppsv b
where a.indx=b.indx
and a.ksppinm like '%_db_handles%';