메뉴 건너뛰기

bysql.net

3. 버퍼 Lock

휘휘 2010.05.23 17:41 조회 수 : 12983

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 원리 사용)

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




번호 제목 글쓴이 날짜 조회 수
67 Front Page file 운영자 2010.05.16 152259
66 1 장. 오라클 아키텍처 운영자 2010.05.19 12406
65 1. 기본 아키텍처 [1] file 휘휘 2010.05.22 17697
» 3. 버퍼 Lock [1] 휘휘 2010.05.23 12983
63 2. DB 버퍼 캐시 file 휘휘 2010.05.23 19724
62 4. Redo file 휘휘 2010.05.24 9320
61 9. Snapshot too old balto 2010.05.30 5973
60 10. 대기 이벤트 balto 2010.05.30 5566
59 7. Consistent vs. Current 모드 읽기 휘휘 2010.05.30 8137
58 8. 블록 클린아웃 휘휘 2010.05.30 9960
57 11. Shared Pool file 실천하자 2010.05.30 16497
56 5. Undo file 토시리 2010.05.30 15833
55 1. 트랜잭션 동시성 제어 실천하자 2010.05.31 6288
54 6. 문장수준 읽기 일관성 file 토시리 2010.05.31 8392
53 2장. 트랜잭션과 Lock 운영자 2010.06.01 4361
52 1. Explain Plan 실천하자 2010.06.06 12639
51 2. AutoTrace 실천하자 2010.06.06 6433
50 3장. 오라클 성능 관리 운영자 2010.06.06 4212
49 3. SQL 트레이스 file balto 2010.06.06 18610
48 4. DBMS_XPLAN 패키지 balto 2010.06.06 7884