버퍼 캐시

버퍼 캐시의 개념
  • 디스크 I/O 최소화
  • 이미 사용된 적이 있는 정보를 메모리 내에 저장하고 재사용하여 성능상 효율을 높임
  • 디스크에 저장된 데이터 블록을 버퍼캐시에 복사 후 사용
  • LRU알고리즘 사용

  • 버퍼 블록 (Buffer Block)
    • 디스크에 저장된 블록이 복사되는 공간으로 SGA 버퍼 캐시 영역을 구성
    • _DB_BLOCK_BUFFERS 파라미터 설정
  • 버퍼 헤더 (Buffer Header)
    • 버퍼 블록의 물리적 주소 정보 저장
    • 버퍼블록은 하나의 버퍼 헤더를 갖는다
    • 실제 데이터가 저장된 버퍼 블록 접근 가능
    • 버퍼 헤더에 저장되는 주요 정보
      • 버퍼 블록의 물리적 주소
      • 버퍼블록이 속해있는 해시체인정보
      • 버퍼블록이 속해있는 워킹셋정보
      • 버퍼블록의 상태정보
      • 버퍼 블록의 락 소유자/대기자 정보
  • 해시 버킷(Hash Bucket)
    • 하나 이상의 버퍼 헤더를 관리
    • 버퍼 캐시에 존재하는 버퍼 수 증가 시 함께 증가
    • _DB_BLOCK_HASH_BUCKERS 파라미터로 설정
  • 해시 체인 (Hash Chain)
    • 해시 버킷이 관리하는 버퍼 헤더의 집합
    • 하나의 해시 버킷은 하나의 해시 체인을 가짐
    • 오라클은 필요한 버퍼 캐시의 데이터를 사용하기 위해 디스크에 저장된 데이터 블록의 물리적 주 소 값과 블록 타입에 해시 알고리즘을 적용하여 해시 벼킷을 지정받은 후 해시 체인을 검색하여 펼요한 데이터 블록이 버퍼 블록으로 복사되어 있는지 확인한다. 이때 이미 복사되어 있다면 이를 재사용하고, 벼퍼 캐시에 존재하지 않는다면 디스크로부터 필요한 데이터 블록을 벼퍼 블록으로 복사한다.
    • 해시 체인 검색 하려면 cache buffers chains 렛치 획득.
      {note}
      필요한 데이터 블록의 버퍼캐시 존재 유무 검색 을 위해 해시 버킷, 해시 체인 사용
      {note}
  • 워킹 셋 (Working Set)
    • 버퍼 블록 상태 관리
    • 데이터 블록을 복사할 프리 버퍼 검색 및 확보 를 목적으로 함.
    • 인스턴스 시작 시 버퍼 블록을 라운드 로빈 방식으로 할당받음.
      < 관리 버퍼 블록 상태 >
프리 버퍼(Free Buffer)사용 가능한 버퍼 블록
더티 버퍼(Dirty Buffer)버퍼 캐시에서 변경되었으나, 데이터 파일에 변경 내용이 적용 안된 버퍼 블록. 데이터 파일에 변경 내용이 적용되면 프리 버퍼로 전환됨.
읽기 중 버퍼(Reading Buffer)데이터 블록을 복사 중인 버퍼 블록
복구 버퍼(Recovery Buffer)DB 복구에 사용 중인 버퍼 블록

워킹 셋 구성

  • 체크포인트 큐 및 파일 큐
    • 체크포인트 발생 시 디스크로 내려 쓸 더티 버퍼 링크 ( LRU, LRUW리스트에서 링크 )
  • LRU (Least Recently Used) 리스트
    • 더티 버퍼 이외에 버퍼 및 LRUW에 등록되지 않은 버퍼 관리
  • LRUW (Least Recently Used Write) 리스트
    • 더티 버퍼 관리
  • 디스크의 블록이 버퍼 블록으로 복사 과정
  1. 오라클 서버 프로세스가 LRU리스트 검색, 프리버퍼 확보
  2. 이 때, 더티버퍼 감지 시 LRUW에 해당 더티버퍼 등록
  3. LRUW 리스트 및 체크포인트/파일 큐에 의해서 관리 및 링크, DBWR 프로세스가 디스크로 반영
  4. 해당 버퍼는 LRU리스트에 프리 버퍼로 등록됨.
  • LRU/LRUW리스트가 관리하는 버퍼 블록에 접근 시 cache buffer lru chain렛치 (LRU렛치) 획득
  • DB_BLOCK_ LRULATCHES 파라미터 값 설정
  • 하나의 LRU렛치는 하나의 워킹셋을 관리함
  • DBWR은 하나 이상의 워킹셋을 할당받으며, 할당된 워킹셋이 관리하는 더티버퍼만 디스크로 내려쓰는 역할을 함
  • DBWR에 할당된 워킹 셋 확인 쿼리
버퍼 캐시 획득 절차
  1. 필요한 데이터 블록 주소 값과 블록 타입에 해시알고리즘 적용, 해시 버킷을 검색 후 cache buffers chains 렛치 획득하여 해시 체인 스캔
    1. 렛치 획득 실패 시 latch: cache buffers chains 대기 이벤트 발생한다.
  2. 해시 체인 스캔으로 버퍼 블록 헤더를 찾아 버퍼 캐시에 존재하는 버퍼 주소 값 획득, 버퍼 블록을 찾는다
    1. 버퍼 캐시에 필요한 블록이 없을 경우, 디스크에서 읽어 프리 버퍼를 찾는다
    2. cache buffers 1ru chains 렛치를 획득 후 LRU리스트 검색. 렛치 획득 실패 시 1atch: cache buffers 1ru chain 대기 이벤 트가발생.
  3. 새로 가져온 블록을 LRU 리스트에 등록, 프리 버퍼에 데이터 블록 복사
  4. 새로운 블록 사용하여 해시 체인이 확장됨
  5. 버퍼 캐시로 읽어들인 블록에 변경 발생 시 LRU리스트에서 LRUW리스트로 이동
  6. 해당 블록은 DBWR에 의해 디스크로 반영
버퍼 캐시 LRU 알고리즘
  • 접촉 계수(Touch Count) : LRU 리스트 내 버퍼 블록을 사용할 때 마다 1씩 증가, 버퍼 블록별로 관리됨.
  • 접촉 계수가 높을수록 자주 사용되는 블록
  1. 버퍼 블록은 사용 후 LRU 리스트 중간에 위치한다
  2. LRU End영역으로 밀려나, 서버프로세스에 의해 다른 데이터 블록이 복사 되려고할 때
  3. 접촉 계수 > _DB_AGING_HOT_CRITERIA : 데이터 블록이 복사되지 않고 MRU End로 올라가고 _DB_AGING_STAY_COUNT 로 초기화
  4. _DB_AGING_STAY_COUNT > _DB_AGING_HOT_CRITERIA : 접촉 계수를 1/2 하여 MRU End 영역으로 밀어냄
  5. 버퍼 캐시에서 전체 테이블 스캔 발생 시, LRU End 영역에 위치 시켜서 LRU리스트에 등록된 후 다른 데이터 블록이 복사되게 한다.
    -> 전체테이블 스캔한 블록의 경우, 재사용 확률이 낮다고 판단.
버퍼 캐시의 종류
기본 풀(Default Pool)기본 블록 크기를 갖는 데이터 블록에 대한 버퍼 캐시 제공, DB_CACHE SIZE 값에 의해 지정된다.
고정풀(KeepPool)사용 빈도가 높고 성능에 대한 요구조건이 높은 데이터블록들에 대해서 고정풀 영역에 위치시킴으로써 재사용률을 높이기 위해 제공.
DB_KEEP_CACHE_SIZE 값에 의해 지정된다.
재사용 풀(Recycle Pool)사용 빈도가 낮고, 대량의 데이터 처리를 필요로 하는 데이터 블록에 대해서 별도의 버퍼 캐시 영역을 제공.
대량의 데이터 처리가 기본 풀의 사용률을 떨어뜨리는 것을 최소화하기 위해서 사용된다. DB_RECYCLE_CACHE_SIZE에 의해 지정.
  • 데이터 블록의 크기에 따라
  • DB_CACHE_SIZE : DB_BLOCK_SIZE 값에 의해서 블록크기가 지정된 기본 블록 저장
  • DB_2K_CACHE_SIZE ~ DB_32K_CACHE_SIZE : 2,4,8,16, 32KB 블록 크기를 가지는 블록 저장
고정 풀
  • 참조 빈도가 높고 빠른 응답 속도를 필요로 하는 데이터 블록을 SGA영역에 상주시킬 수 있도록 하는 별도 버퍼캐시 영역
  • 테이블 CACHE 설정
  • 테이블의 STORAGE 설정에서 CACHE, NOCACHE 설정 선택
  • 테이블 전체 스캔 시
    • NOCACHE : LRU리스트의 LRU End영역에 위치, 이후 빨리 다른 데이터 블록에 의해 사용됨
    • CACHE : MRU End 영역에 위치하여 버퍼 블록 재사용 확률 높아짐
  • 크기가 작고 풀스캔 발생, 조회 빈도가 높은 테이블의 경우 CACHE 옵션 사용이 유리 (디스크I/O 감소)
  • CACHE옵션은 인덱스에서 지원되지 않음
  • 50블록 미만의 크기이며 풀스캔 수행되는 테이블을 KEEP풀 영역으로 저장하는 명령 생성

재활용 풀
  • 배치성 업무 시 대량의I/O발생, 버퍼 블록 재사용 확률이 떨어짐.
  • 임시성, 배치성 업무에서 사용되는 대용량 테이블에 대해 재활용 풀 사용이 유리
  • 재활용 풀 지정 권고되는 테이블 리스트 추출
  • 기본 버퍼 캐시 영역의 5% 이상 공간 차지, 캐시 영역의 블록들이 한번씩만 참조된 오브젝트와 캐시 영역 사용 현황
  • DB_nK_CACHE_SIZE
  • 서로 다른 블록 크기를 갖는 버퍼 캐시를 동시에 사용 가능
  • nK : 블록 크기
  • Tablespace 생성 시 지정한 블록 크기로 캐시 영역을 사용함.
  • 블록 크기 미지정 시 기본 캐시 영역이 가지는 블록 크기와 동일한 크기를 가짐
데이터 블록 크기에 따른 성능 고려 사항
  • 큰 블록 사용 시, 한번의 I/O로 효율성이 높으나
    서로 다른 세션이 액세스 할 확률이 커져 블록 경합 가능성 존재.
  • 동일한 블록 참조 시 블록 경합으로 성능 저하 가능성.
  • 작은 블록 사용 시, I/O 성능은 저하 하나
    서로 다른 세션이 액세스 시 분산이 가능함.

  • OLTP 시스템 : 작은 블록을 여러 세션에서 액세스 하는 패턴. 블록 사이즈가 작은게 유리함.
  • 배치 업무 : 한번의 I/O로 많은 데이터 액세스가 효과적이므로 큰 블록사이즈가 유리함.

  • SGA_TARGET 설정하여 자동메모리관리(ASSM) 사용 시 버퍼 캐시 영역 사이즈는 SGA_TARGET 파라미터로 설정
  • ASSM에 의해 설정된 SGA영역 크기는 V$SGA_DYNAMIC_COMPONETS뷰로 확인 가능
대기 이벤트
  • 버퍼 캐시에서 발생하는 대기 이벤트
  • 비효율적 SQL 튜닝
  • 핫 블록 경합 예방을 위해 테이블, 인덱스 블록 경합 최소화하는 물리 구성 필요