프로그램/오라클

[오라클]데이터베이스 버퍼 캐시

amanda_ai 2024. 4. 2. 13:54
반응형

데이터베이스 버퍼 캐시

- 사용자가 입력한 데이터를 데이터 파일에 저장하고 이를 다시 읽는 과정에서 거쳐가는 캐시영역- 물리적인 I/O를 최소화하기 위해 최근에 사용한 블록에 대한 정보를 저장하는 메모리의 일정 영역

 

-  해시 테이블은 인스턴스가 시작될 때 내부적으로 자동 생성

 

블록 단위 I/O

오라클은 블록단위로 I/O가 이루어짐메모리 버퍼와 데이터파일간 읽기,쓰기 모두 블록단위로 처리-Single block read: 인덱스 경유시 한번에 한블록씩 읽어들임 -Multiblock read : Full Scan시에는 성능 향상을 위해 한번에 여러블록을 읽어 들임 DBWR (BG 프로세서) : 버퍼캐시로부터 변경된 블록을 주기적으로 데이터 파일에 기록하는 작업 수행(블록단위)SQL 성능을 좌우하는 가장 중요한 지표는 액세스하는 블록개수이며 옵티마이져에도 가장큰영향을 끼침

 

step1)

래치 획득

step2)

오라클 블록의 주소값(DBA = Data Block Address)과 오라클 블록의 클라스 정보를 hash 함수에 input 값으로 입력하게 되면 임의의 hash value가 함수 output값으로 나오게 된다. 이 값을 가지고 해시 버켓들을 스캔하여 자신이 가지고 있는 hash value 와 같은 값을 가지는 해시 버켓을 찾아 간다.

step3)

해시 버텟 내부에 체인방식으로 연결된 버퍼 헤더들을 처음부터 스캔을 하다가 찾고자 하던 버퍼가 발견되면 이 시점에서 일단 래치는 반환하고 해당 버퍼를 액세스하게 된다.

해당 버퍼가 다른 프로세스에 의해 사용중인 경우가 발생하면 해당 버퍼 헤더에 저장되어있는 버퍼 lock wait list에 자신을 등록한 후 버퍼락이 해제될 때까지 기다려야하는 상황이 발생

버퍼 락을 점유한 채 사용하고 있던 프로세스의 작업이 끝나 버퍼 락이 해제되면 대기자 명단에 있었던 나의 프로세스가 버퍼 락을 획득한 후 원했던 작업을 진행

step4)

작업 완료후에는 버퍼 락을 해제해야 되는데 이때 다른 프로세스와 충돌이 이러날 수 있으므로 해당버퍼가 속학 Cache buffer chains latch를 다시 획득해야 한다.

버퍼 상태

 

- Free 버퍼 : 인스턴스 기동 후 아직 데이터가 읽히지 않아 비어있는 상태(Clean 버퍼)이거나 언제든지 덮어 써도 무방한 버퍼 블록  - Dirty 버퍼 : 버퍼에 캐시된 이후 변경이 발생했지만, 아직 디스크에 기록되지 않아 데이터 파일 블록과 동기화가 필요한 버퍼 블록- Pinned 버퍼 : 읽기 또는 쓰기 작업을 위해 현재 액세스되고 있는 버퍼 블록

LRU 알고리즘

l  LRUW(LRU Write list) List

- 수정되어 디스크에 반영되어야 할 블록들의 리스트.- LRUW에 모인 Dirty Buffer DBWR에 의해 디스크로 쓰여지고 나면 이 Buffer Free Mark 되어 다시 사용될 수 있도록 LRU List의 끝부분에 위치하게 됩니다.

l  LRU(Least Recently Used) List

- 최근에 읽혀진 Datafile Block Buffer Cache에 보관하고, 새로운 Block 이 파일에서 읽혀질 필요가 있으면 사용한지 가장 오래된 버퍼들부터 메모리에서 없어지도록 관리하기 위한 Buffer Cache 내의 Block List 관리 방법.- LRU(Least Recently Used) list의 버퍼들은 Free buffer, Pinned Buffer, Dirty Buffe중 하나로 존재- 처음엔 버퍼가 Free 상태인데 사용자가 질의를 해서 디스크에서 테이블의 내용을 읽으면 이 블록들은 LRU에서 가장 최근에 읽은 것 이므로 HEADER 부분(MRU, Most recently used)에 이 버퍼들이 차츰 다른 테이블의 내용들이 읽혀 짐에 따라 LRU tail부분인 LRU(Lease Recent Used)로 이동- 만약 사용자가 대량의 데이터를 질의하여 버퍼가 필요한데 빈 버퍼가 없다면 제일 사용된 빈도가 작은 블록을 찾기 위해 LRU 알고리즘에 의해 LRU list의 맨 끝인 tail 부분부터 검색데이터베이스 버퍼 캐시 영역 구성 방법1) Default 버퍼 풀(_cache_size 파라미터 적용, 기본적으로 생성)- db_cache_size라는 파라미터를 적용하여 생성- SGA 내부에 구성하는 기본 데이터베이스 버퍼 캐시영역- 반드시 생성해주어야 하는 기본 풀2) keep 버퍼 풀(db_keep_cache_size 파라미터 적용)- db_keep_cache_size 파라미터에 의하여 생성되는 영역- 자주 재사용 되는 블록들을 저장하고자 하는 경우 추가적으로 생성- Default 풀 만을 사용하게 되면 모든 오라클 블록들이 한 곳에서만 저장 불필요한 오라클 블록들이 자주 데이터베이스 버퍼 캐시에 올라오게 되면 LRU알고리즘에 의하여 버퍼 캐시에서 버려지는 상황이 발생- 정말 중요하고 자주 참조되는 테이블의 데이터의 경우에는 별도의 공간인 keep버퍼 풀에 저장, 관리되도록 설정 할수 있다.

3) Recycle 버퍼 풀(db_recycle_cache_size 파라미터 적용)- 언제든지 제거되어 재사용 될 수 있는 공간- 자주 재사용되지 않는 데이터 블록을 임시적으로 저장하게 될 공간을 설정- 풀 테이블 스캔이 실행되는 대상이 되는 테이블들의 경우 임시적으로 저장하는 방식을 설정

 

 

반응형