h1.1. 메모리 관리
h3.A. 그레뉼
SQL> select BYTES/1024/1024 from v$sgainfo where name='Granule Size';
BYTES/1024/
-----------
4
SQL> select
COMPONENT, current_size/1024/1024, granule_size/1024/1024
from v$sga_dynamic_components
where component like '%buffer cache';
COMPONENT CURRENT_SIZ GRANULE_SIZ
---------------------------------------------------------------- ----------- -----------
DEFAULT buffer cache 20 4
KEEP buffer cache 0 4
RECYCLE buffer cache 0 4
DEFAULT 2K buffer cache 0 4
DEFAULT 4K buffer cache 0 4
DEFAULT 8K buffer cache 0 4
DEFAULT 16K buffer cache 0 4
DEFAULT 32K buffer cache 0 4
SQL> select
ge.grantype, ct.component, ge.granprev, ge.grannum, ge.grannext
from x$ksmge ge, x$kmgsct ct
where
ge.grantype != 6
and ct.grantype = ge.grantype
order by ct.component, ge.grantype;
GRANTYPE COMPONENT GRANPREV GRANNUM GRANNEXT
----------- ---------------------- ----------- ----------- -----------
7 DEFAULT buffer cache 209 210 211
7 DEFAULT buffer cache 210 211 208
7 DEFAULT buffer cache 0 212 209
7 DEFAULT buffer cache 212 209 210
7 DEFAULT buffer cache 211 208 0
3 java pool 0 214 0
2 large pool 0 215 0
1 shared pool 246 245 244
1 shared pool 245 244 243
1 shared pool 244 243 242
1 shared pool 243 242 241
1 shared pool 242 241 240
1 shared pool 241 240 239
.
.
.
h3.B. 그레뉼과 버퍼
h1.2. Multiple 데이터캐시
1. db_cache_size - 기본 캐시이며, db 기본 블록 크기 설정을 따른다.
2. db_keep_cache_size - buffer_pool keep storage 옵션을 사용한 오브젝트를 위해 사용된다. 캐시 내에 오브젝트를 상주시키는 목적이며, 파라메터로 지정한 사이즈는 오브젝트 사이즈보다 커야 한다.
3. db_recycle_cache_size - buffer_pool recycle 옵션을 사용한 오브젝트를 위해 사용된다. 혹은 keep cache 를 설정 한 오브젝트의 읽기 일관성을 위한 복제 블록을 생성하는 공간으로도 사용한다.
4. db_2k_cacha_size - 기본 블록 크기가 2k 가 아닌 db 의 2k 블록 테이블스페이스 생성 시 사용한다.
5. db_4k_cacha_size - 기본 블록 크기가 4k 가 아닌 db 의 4k 블록 테이블스페이스 생성 시 사용한다.
6. db_8k_cacha_size - 기본 블록 크기가 8k 가 아닌 db 의 8k 블록 테이블스페이스 생성 시 사용한다.
7. db_16k_cacha_size - 기본 블록 크기가 16k 가 아닌 db 의 16k 블록 테이블스페이스 생성 시 사용한다.
8. db_32k_cacha_size - 기본 블록 크기가 32k 가 아닌 db 의 32k 블록 테이블스페이스 생성 시 사용한다.
h3.A. 그레뉼과 버퍼 풀
h3.B. 버퍼 풀
h1.3. Working data set
SQL> select
ADDR, SET_ID, CNUM_SET, SET_LATCH, NXT_REPL, PRV_REPL, NXT_REPLAX, PRV_REPLAX, CNUM_REPL, ANUM_REPL
from x$kcbwds;
ADDR SET_ID CNUM_SET SET_LATCH NXT_REPL PRV_REPL NXT_REPLAX PRV_REPLAX CNUM_REPL ANUM_REPL
---------------- ----------- ----------- ---------------- ---------------- ---------------- ---------------- ---------------- ----------- -----------
000000009EA7B5B0 1 0 000000009EA7B908 000000009EA7BA98 000000009EA7BA98 000000009EA7BAA8 000000009EA7BAA8 0 0
000000009EA96B48 2 0 000000009EA96EA0 000000009EA97030 000000009EA97030 000000009EA97040 000000009EA97040 0 0
000000009EAB20E0 3 2455 000000009EAB2438 0000000094FF60C0 00000000957F8330 0000000094BE76D0 0000000095BDEF70 2455 558
000000009EACD678 4 0 000000009EACD9D0 000000009EACDB60 000000009EACDB60 000000009EACDB70 000000009EACDB70 0 0
000000009EAE8C10 5 0 000000009EAE8F68 000000009EAE90F8 000000009EAE90F8 000000009EAE9108 000000009EAE9108 0 0
000000009EB041A8 6 0 000000009EB04500 000000009EB04690 000000009EB04690 000000009EB046A0 000000009EB046A0 0 0
000000009EB1F740 7 0 000000009EB1FA98 000000009EB1FC28 000000009EB1FC28 000000009EB1FC38 000000009EB1FC38 0 0
000000009EB3ACD8 8 0 000000009EB3B030 000000009EB3B1C0 000000009EB3B1C0 000000009EB3B1D0 000000009EB3B1D0 0 0
8 rows selected.
cnum_set - WDS 안의 버퍼 수
set_latch - WDS 를 보호하는 cache buffers lru chain 래치주소
nxt_repl - 링크드리스트의 양쪽 끝 주소
prv_repl - 링크드리스트의 양쪽 끝 주소
nxt_replax - 링크드리스트의 양쪽 끝 주소
prv_replax - 링크드리스트의 양쪽 끝 주소
cnum_repl - 링크드리스트의 총 버퍼 수
anum_repl - aux 링크드리스트의 총 버퍼 수
h3.A. LRU/TCH 알고리즘
h3.B LRU/TCH 동작 방식
h5.시나리오(a) 는 WDS 로 새로운 블럭 적재
h5.시나리오(b) 는 (a) 이후 WDS 로 두 번째 블록 적재하는 단계
h5.(a) Case
1.새로운 블럭 적재 위해 프리버퍼 탐색
2. 교체 리스트(repl_main)의 LRU 끝부터 검색
3. LRU 끝의 tch 확인 - 1일 경우(자주 접근하지 않음)
4. pinned/dirty 상태인지 확인
5. 버퍼에 베타적 pin 설정
6. 블록 읽기
7. 버퍼 헤더 변경
8. LRU List 끝에서 midpoint 에 연결
9. 버퍼 unpin
h5.(b) Case - LRU 끝 블록의 TCH 가 1이 아닐 때
1. 해당 버퍼를 LRU 끝에서 분리 후 MRU 끝으로 이동
2. TCH 값을 반으로 줄임
3. 다음 번 버퍼의 TCH 값을 확인
h1.4. REPL_AUX
h3.A. repl_aux 의 동작 방식
1. 인스턴스 시작 시 모든 버퍼는 repl_aux 에 연결, repl_main 에는 없음
2. 새 블럭 읽어들일 때 repl_aux 의 lru 끝에서부터 버퍼를 찾은 후에
3. 해당 버퍼를 repl_aux 에서 분리한 후 repl_main 에 연결
4. repl_main 에서 repl_aux 로 재 이동시키는 매커니즘 존재
h3.B. repl_aux 리스트를 목표 크기로 유지하는 이유는?
h1.5. 데이터 검색
h3.A. 버퍼 Pinning
1. 블록주소 이용해 해시버킷 계산
2. cache buffers chains 래치 획득
3. 해시버킷에서 필요 버퍼 검색, Pin 설정
4. cache buffers chains 래치 릴리즈
5. 버퍼 관련 작업 수행
6. cache buffers chains 획득
7. 버퍼 Unpin
8. cache buffers chains 래치 릴리즈
h3.B. 논리적 I/O
1. cache bufer hash chain 을 획득
2. 체인을 따라가며 블록 검색
3. 블록 조사 중 래치 릴리즈 가능
1. 래치획득
2. 체인검색
3. 버퍼헤더 핀(s) 설정
4. 래치 릴리즈
5. 블록 내용 확인
6. 래치 획득
7. 핀 릴리즈
8. 래치 릴리즈
h3.C. 데이터 변경
h5.1) pk 에 의한 Update
*언두세그먼트 헤더/언두블록 접근 절차 추가 필요 - 두 개의 cache buffers chains 레치 획득, 두 개 체인 검색 필요
h5.2) 테이블스캔에 의한 업데이트
h3.D. 해시 체인 로딩
h3.E. CR 복제
1. 해당 블록의 cr 복제본을 생성
2. 체인 검색 후에도 CR 복제본을 찾지 못할 경우는 복제 작업 수행
4.모든 래치를 릴리즈하고
5. 복제 블록을 원하는 시점(쿼리 시작 scn) 까지 되돌리는 작업 수행
h3.F. 물리적 I/O
1. 적재를 위한 버퍼를 repl_aux 에서 획득 후
2. 데이터 블록 주소를 표시하고
3. 해시체인에 연결한 후
4. X 모드 핀 설정
5. 래치 릴리즈 하고 버퍼로 디스크 블록 적재
h3.G. 테이블 스캔
h5 테이블스캔, 인덱스 풀 스캔으로 인해 다수의 버퍼가 밀려날 수 있으므로 아래와 같은 처리 매커니즘으로 보완
h5 10g 에서는 테이블 크기에 따라 설정값을 참고하여 캐싱이 동작한다