■ Data Buffer Cache
- database 에서 읽어 들인 block 을 메모리에 올려 놓은 영역
- 물리적인 I/O 를 최소화하기 위한 메모리영역
SELECT문 처리 과정
1. parse 단계
- 구문 분석, 실행 계획을 수립
2. bind 단계
- SQL 문장 내의 바인드 변수 와 실제값이 연결
3-1. execute 단계
- library cache lock 과 library cache pin 이 'shared mode'로 변환하고 SQL문을 실행한다.
→ 실행되는 동안 해당 SQL 문장에 대한 실행 계획을 따라가게 된다.
3-2. 실행 계획 수립 및 데이터 블록 접근
- SQL 문장의 실행 계획을 통해 필요한 데이터 블록에 접근한다.
- 필요한 블록의 `DBA(Data Block Address)`와 `Block class`(블록의 종류) 등에 대한 정보를 해시 함수를 이용하여 해시 값으로 변환한다.
- 이 해시 값에 해당하는 해시 버킷을 찾아서 해당 버킷을 관리하는 `shared pool`에서 현재 `data buffer cache`에 올라온 블록의 정보를 확인한다.
3-3. Latch 획득
- 해시 값에 해당하는 해시 버킷을 검색하기 위해서는 해당 버킷을 관리하는 데이터 구조에 접근해야 한다.
→ 다른 세션이 이미 해당 데이터 구조에 대한 락(latch)을 획득한 경우에는 기다려야 함.
- `latch : cache buffers chains`는 이러한 상황에서 발생하는 이벤트로, 다수의 세션이 동시에 같은 자원을 사용하려고 할 때 경합이 발생하는 것을 나타낸다.
4. fetch 단계
- 실행 계획을 따라 데이터 블록에 접근하고 필요한 데이터를 가져오는 단계
- 최종적으로 사용자에게 요청한 데이터가 반환되어 결과 집합이 형성된다.
#) latch_children 중 'cache buffer chains' 확인
select count(*) from v$latch_children where name = 'cache buffers chains';
#) 현재 latch 의 수
SELECT a.ksppinm Parameter, b.ksppstvl Session_Value, c.ksppstvl Instance_Value
FROM x$ksppi a, x$ksppcv b, x$ksppsv c
WHERE a.indx = b.indx
AND a.indx = c.indx
AND a.ksppinm = '_db_block_hash_latches';
#) 현재 bucket의 수
SELECT a.ksppinm Parameter, b.ksppstvl Session_Value, c.ksppstvl Instance_Value
FROM x$ksppi a, x$ksppcv b, x$ksppsv c
WHERE a.indx = b.indx
AND a.indx = c.indx
AND a.ksppinm = '_db_block_hash_buckets';
※ 하나의 latch 담당하는 bucket 수는 65536 / 2048 = 32