mingming

Oracle DB Architecture - Data Buffer Cache 본문

새싹 하이브리드 클라우드/Database

Oracle DB Architecture - Data Buffer Cache

mingming_96 2023. 10. 11. 18:18

 

데이터 버퍼 캐시 ( Data Buffer Cache )

  • SGA의 일부로서 데이터 파일에서 읽은 블록 복사본을 보관합니다.
  • 데이터 버퍼 캐시는 필요한 데이터 블록을 최대한 메모리에서 엑세스 할 수 있도록 메모리에서 데이터 블록을 저장하는 공간입니다.
  • 엑세스하고자 하는 데이터 블록을 빠르게 찾을 수 있도록 데이터베이스 버퍼 캐시에 존재하는 데이터 블록에 대한 검색 기능을 강화한 해시 테이블 아키텍쳐 사용
  • 엑세스하고자 하는 데이터 블록에 대해 Logical Read가 발생할 수 있도록 구현하기 위한 LRU 알고리즘 사용
  • 데이터 버퍼 캐시의 크기는 DB_CACHE_SIZE 파라미터를 통해 결정됩니다.

LRU 리스트

  • 퍼캐시의 효율을 높이기 위해 사용되며 , 최근에 사용될 수록 리스트의 헤드 쪽에 위치 시키고버퍼가 필요할 경우 리스트의 끝 부분부터 찾아서 재사용
  • 신규 블록은 일반적으로 헤드에 위치  

체크포인트 큐 ( Checkpoint queue ) 

  • Dirty 버퍼가 SCN으로 정렬되어 저장되며 체크포인트시 체크포인트  SCN 이전의 Dirty 버퍼가 순차적으로 내려써지게 됩니다.    

버퍼 블록의 상태 

  • Pinned : 현재 읽고 있거나 쓰고 있는 상태
  • Clean : 디스크와 동기화 되어 재사용 할 수 있는 상태의 블록
  • Free/unused : 인스턴스 시작 후 아직 사용되지 않은 블록
  • Dirty : 변경 후 디스크에 동기화 되지 않은 블록 

데이터 버퍼 캐시 처리 과정

1. 특정 테이블에서 SELECT 문이 실행됩니다.

2. SQL 수행 시 Shared Pool 에서 파싱이 완료되었다면 데이터 버퍼 캐시에서 데이터가 저장되어 있는 블록이 존재하는지 검색합니다.

3. 데이터 블록이 존재하지 않는다면 서버 프로세스가 필요한 블록을 디스크로부터 버퍼 캐시로 캐싱합니다.

4. 데이터 블록이 존재한다면 버퍼에 저장된 캐시 값을 반환합니다.

 

NOTE

디스크로부터 버퍼 캐시로 캐싱  Physical Read, 버퍼캐시에서 서버프로세스로 반환  Logical Read 라고 합니다.
Oracle의 I/O 최소 단위는 block 입니다. 따라서 필요한 데이터가 속한 모든 블록이 데이터 버퍼 캐시로 올라오게 됩니다.
Oracle의 데이터 블록의 기본 단위는 8K로 설정되어 있습니다. 
서버 프로세스는 필요한 데이터 블록의 수가 여러개 일지라도 하나씩 데이터 버퍼 캐시로 캐싱하게 됩니다. 

다중 데이터 블록 크기 지정 

오라클 9i 부터 여러 개의 데이터 블록 크기를 설정할 수 있게 되었습니다. 아래의 명령을 통해 확인 가능합니다.

SQL> show paramether CACHE_SIZE

해당 값을 변경하기 위해선 Oracle Parameter 파일을 변경해주면 됩니다.

 

데이터 블록 크기 변경

데이터 블록 크기를 크게하면 원하는 데이터가 동일 데이터 블록에 저장될 확률이 높아지고, 데이터 버퍼 블록의 재사용 확률이 높아지게 됩니다.

동시에 많은 유저가 동일 데이터 블록을 사용할 확률이 높아져 데이터 블록에 대한 경합 발생 가능성이 증가하게 됩니다.

 

16KB 데이터 버퍼 캐시를 사용하는 TBS 테이블 스페이스의 생성 예제입니다.

SQL> CREAWTE TABLESPACE TBS
     DEFAULT '/data1/tbs_1.dbf' size 10M BLOCKSIZE 16K;

 

다중 데이터 버퍼 캐시

데이터 버퍼 캐시 종류마다 독립된 영역 및 독립된 LRU 리스트를 가집니다.  종류 또는 파라미터마다 메모리 관리 알고리즘이 다르지 않으며 고정 데이터 버퍼가 메모리에 더 오래 유지되는 이유는 다른 데이터 버퍼 캐시보다 크기가 크기 때문입니다.

종류 설명
기본(Default) 일반 데이터 버퍼 캐시를 의미하며 DB_CACHE_SIZE 파라미터에 의해 설정됩니다. 일반적인 테이블이나 인덱스는 기본 데이터 버퍼 캐시를 이용합니다.
고정(Keep) 해당 데이터 버퍼 캐시로 읽혀진 데이터 블록은 재사용률이 높다고 판단하여 해당 데이터 버퍼 캐시의 내용을 삭제하지 않으려고 합니다. 고정 데이터 버퍼 캐시는 DB_KEEP_CACHE_SIZE 파라미터에 의해 설정됩니다. 자주 사용되고 성능을 좌우할 수 있는 테이블이나 인덱스를 위치시킵니다. ( 코드성 테이블 )
재활용 (Recycle) 해당 데이터 버퍼 캐시는 재사용이 거의 안된다고 판단하여 해당 메모리 블록은 짧은 시간 안에 제거되게 됩니다. DB_RECYCLE_CACHE_SIZE 파라미터에 의해 설정됩니다.
SQL> ALTER TABLE EMP STORAGE(BUFFER_POOL KEEP);
SQL> ALTER TABLE EMP STORAGE(BUFFER_POOL RECYCLE);