문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
study:oracle:adv_owi_10g:oracle_internal_owi [2009/07/30 00:01] deathguy |
— (현재) | ||
---|---|---|---|
줄 1: | 줄 1: | ||
- | ====== Buffer Cache 란 ====== | ||
- | |||
- | - 오라클은 물리적인 I/O를 최소화 하기 위해 최근에 사용된 블럭에 대한 정보를 메모리의 일정 부분에 보관하려 한다 => 이 영역을 Buffer Cache 라고함. | ||
- | |||
- | ===== Buffer Cache 구조 ===== | ||
- | {{: | ||
- | |||
- | - Hash Chain 구조의 시작점은 Hash Table인데, | ||
- | - 오라클 블럭(DBA: Data Block Address File# , Block# )과 블럭 클래스 에 대한 Hash 함수 결과 값으로 해당 Hash Bucket을 찾아가서 해당 데이터 블럭이 메모리에 존재 하는지를 확인 할 수 있는 것 이다 | ||
- | - Hash Bucket에 딸린 Buffer Header는 Buffer에 대한 메타 정보만 가지고 있고 Buffer 메모리 영역의 실제 버퍼에 대한 포인터 값을 가지고 있다. | ||
- | - Hash Chain 구조는 Shared Pool 영역에 존재 하며 실제 버퍼에 대한 정보들은 버퍼 캐쉬 영역에 존재 한다 | ||
- | - 특정 블럭에 대한 Scan을 할려고 하면 Cache buffer chains latch를 획득 해야만 한다. \\ **※ 9i부터 읽기 작업에 한하여 buffer cache chains latch를 shared 모드로 획득 한다** | ||
- | - 다음과 같은 쿼리를 이용하여 cache buffer chains latch의 갯수를 확인가능 하다 \\ <code sql> | ||
- | select count(*) from v$latch_children where name = 'cache buffers chains' | ||
- | </ | ||
- | |||
- | ==== Working Set ==== | ||
- | - 오라클은 Buffer Cache에 대하여 효율적으로 사용하기 위해 두 종류의 LRU리스트를 사용한다. | ||
- | |||
- | LRU List : 가장 최근에 사용되거나 미사용된 버퍼들의 List | ||
- | Free(미사용) , 사용중이거나 사용된 버퍼 아직 LRUW로 옮겨지지 않은 Dirty 버퍼 | ||
- | 메인 리스트 : 사용된 버퍼들의 리스트 , 핫 영역과 콜드 영역으로 구분 관리 됨 | ||
- | 보조 리스트 : 프리 버퍼들의 리스트 , 미사용 된 버퍼나 DBWn에 의해 기록 된 버퍼 관리 | ||
- | |||
- | LRUW List : 아직 디스크에 기록 되지 않은 | ||
- | 메인 리스트 : 변경된 버퍼들의 리스트 | ||
- | 보조 리스트 : 현재 DBWR에 의해 기록중인 버퍼 리스트 | ||
- | LRU , LRUW를 합쳐서 하나의 Working Set 이라고 부른다. | ||
- | Working Set 개수는 Cache buffer lru latch 개수에 의해 결정( 하나의 working set을 하나의 lru latch가 관리함 )되며 | ||
- | X$KCBWDS( Kerner Cache Buffer Working sets Descriptors )를 조회 하면 확인 가능 | ||
- | LRU , LRUW List를 탐색 하고자 하는 프로세스는 반드시 cache buffer lru chain latch를 획득 해야 함. | ||