Shared Pool / Library Cache 와 OWI
Shared Pool과 Heap
Shared Pool은 SGA 영역 중 Variable 영역에 속함 1
- Library Cache
- Row Cache(=Data Dictionary Cache)
Shared Pool이 어떤 메모리 영역으로 나누어지는 확인 -> V$SGASTAT 뷰 조회
SYS>ed
Wrote file afiedt.buf
1* select count(*) from v$sgastat where pool='shared pool'
SYS>/
COUNT(*)
----------
872 -> 총 872 개의 메모리 영역으로 나누어짐
각 메모리 영역의 크기는 동적으로 변하게 됨
Shared Pool의 구성요소
Permanent Area : process, session, segmented array(enqueue, transaction,...), 프로세스 목록, 세션 목록, Enqueue 목록 등의 자원들은 Shared Pool 영구 영역(Permanent Area)에 할당되며 인스턴스와 그 수명을 같이 함
Library Cache : SQL문을 수행하는데 필요한 모든 객체(SQL,테이블, 뷰, 프로시저 등)에 대한 정보를 관리함
Row Cache(Dictionary Cache) : 오라클이 사용하는 딕셔너리 정보를 관여함
Reserved Area : 예약영역, 동적인 메모리 할당을 위해 오라클 여분의 예약 영역을 할당해줌
Shared Pool은 힙(heap)라고 불리는 메모리 관리기법을 이용해 관리
- 힙은 순서대로 저장하지 않고 빈자리가 있으면 막 넣기 때문에 별도의 리스트(Heap Manager)가 필요함
shared pool heap 구조도
Shared pool heap 으로 부터 메모리를 할당받고자 하는 모든 프로세스는 반드시 shared pool latch 를 획득 해야함
하드 파싱이 발생하는 경우
- 프로세스는 새로운 SQL문을 저장할 공간을 Shared pool에서 할당 받아야 하고, 반드시 Shared pool latch 를 획득 해야함
- Shared pool latch는 기본적으로 전체 인스턴스에 하나만 존재하며, 필요한 메모리(청크)를 할당받는 전체 과정동안 보유해야 함
- 동시에 많은 프로세스가 Shared pool 메모리를 사용하는 경우 latch를 획득하는 과정에서 경합이 발생하게 됨
이 때, latch:shared pool 이벤트를 대기함
- Shared Pool + Java Pool + Large Pool + Streams Pool 등으로 구성 [본문으로]