SGA
h5.1. Variable영역
- shared pool : SQL문을 처리하고 커서를 공유하는데 사용된다. 쿼리를 실행하기 위해 필요한 구문분석 정보와 실행계획을 저장한다. (shared pool = 라이브러리캐시 + 딕셔너리캐시)
- java pool(8i) : 오라클 JVM에 접속해 있는 모든 세션에서 사용하는 자바코드를 위한 메모리 영역이다.
- Large Pool(8) : MTS사용시 UGA(User Global Area)영역을 large pool에 할당하며 백업 및 복구작업과 병렬쿼리 수행시 메세지 버퍼를 위해 사용된다.
- Streams pool(10g) : 오라클 스트림(데이터 동기화) 기능 사용시에 필요한 데이터 전송 버퍼를 위해 사용된다.
- Free Memory
h5.2. v$sgainfo : SGA에 대한 크기 관련 정보 확인 가능한 성능관리 뷰
Shared Pool
- 공유 Data를 저장하기 위해 마련된 메모리 공간. SGA 영역중 Variable 영역에 속한다.
h3.구성
h5.1. 라이브러리 캐시
- SQL실행에 관련된 모든 객체에 대한 정보 관리
- 서버 프로세스가 SQL을 작업할 때 사용하는 작업 공간
- Shared SQL Area : SQL문장, 파스트리, 실행계획 저장
- PL/SQL Procedure : PL/SQL문장, 컴파일된 프로그램 및 프로시저 저장
- Control Structures (Lock, Libray Cache Handles)
h5.2. 데이터 딕셔너리 캐시(Row Cache)
- 테이블과 뷰에 대한 정보,구조,사용자등에 대한 시스템 메타 정보 관리
h5.3. 예약영역(Reserved Area)
- BIG OBJECT(SHARED_POOL_RESERVED_MIN_ALLOC에 설정된 크기 이상)를 위한 여분의 메모리 ( 기본설정 : 4400bytes)
- SHARED_POOL_RESERVED_SIZE : SHARED_POOL_SIZE * 5%
h5.4. 시스템영역(Permanent Area)
- Process, Session, Enqueue, Transaction 등의 목록 정보
h5.5. 구성조회
오라클의 동적 메모리 관리 기법(Heap)
h5.1. heap Manager(KGH. Kernal Generic Heap)에 의해 관리
- 기본적인 메모리 할당 방식
- 메모리 매니저(KSM. Kernal Service Memory)가 제공하는 서비스를 이용하여 동적으로 메모리 관리
- 라이브러리 캐시 매니저(KGH. Kernal Generic Library Cache)는 heap Manager이용하여 라이브러리 캐시를 관리
h5.2. SGA, PGA, UGA, CGA 메모리는 모두 Heap으로 동적 관리됨
h5.3. 자동 메모리 관리 기법 사용시 여러 개의 최상위 Heap 사용
- PGA_AGGREGATE_TARGET 사용 : PGA, UGA, CGA(Call Global Area) 각가 최상위 Heap으로 관리
- SGA_TARGET 사용 : Shared Pool이 여러개의 최상위 Heap으로 관리
h5.4. 하나의 Heap은 여러 개의 Sub Heap으로 구성 가능
- 여러 개의 shared pool 사용 가능 (9iR2)
- CPU개수가 4개보다 크고 shared pool 크기가 250MB 이상인 경우에 서브 풀을 사용
- _KGHSIDK_COUNT 히든 파라메터를 이용하여 서브 풀 개수를 조정
Shared Pool Memory 구조
- 여러개의 Extent로 구성 ( 하나의 Extent는 물리적으로 연속된 메모리 영역)되며, Extent간의 연결은 linked list구조를 사용한다.
- Extent는 여러개의 Chunk로 구성 ( Chunk는 다양한 크기를 가지며 X$KSMSP fixed 테이블을 통해 Chunk현황 조회 가능, free 혹은 recr상태인 chunk들이 재사용 가능)
Shared Pool 관리
- 메모리 공간 요청시 chunk단위로 할당
- Freelist : free chunk목록
- Modified LRU List : 현재 사용중이지 않은 재생성 가능 chunk목록
- Reserved Freelist : 최상위 Heap에만 존재, Shared Pool의 예약현황에 대한 Freelist
Free Chunk 검색
1) Freelist -> Modified LRU List
2) 특정 크기 이상의 object는 Reserved Freelist에서 검색하여 사용 가능
3) 원하는 크기의 사용 가능한 chunk가 없고, Reserved Freelist를 사용 못하면 ORA-4031에러 발생. ( Shared Pool에 free메모리가 있더라도 ORA-4031에러발생)
Shared Pool Heap 구조
1) Shared Pool은 기본적으로 하나의 최상위 힙을 가짐 (9i부터 여러개의 최상위 힙을 가질 수 있음)
2) 최상위 힙은 여러개의 서브힙을 포함, 서브힙은 또한 그 자신의 서브힙을 포함
3) 힙과 서브힙은 동일 구조
4) 힙에 속한 하나의 chunk가 서브힙에 대한 포인터 역활
5) 힙은 freelist를 관리하는 버켓테이블을 가지며, 각 버켓은 free chunk에 대한 freelist를 linked list형식으로 저장
5) 하나의 힙은 총 255개의 버켓을 가질 수 있으며, chunk크기는 버켓번호가 증가함에 따라 순차적으로 증가
6) 힙은 자신이 포함하는 특정 chunk에 서브힙의 주소를 지정하여 서브힙의 위치를 관리. ( heap dump에서 'ds'값을 가지는 chunk가 서브힙의 위치를 저장하고 있는 chunk)
문서에 대하여
- 최초작성자 : ~kwlee55
- 최초작성일 : 2010년 09월 07일
- 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
- {*}이 문서의 내용은 (주)엑셈에서 출간한 'PRACTICAL OWI IN ORACLE 10G'와 'Advanced OWI in Oracle 10g'를 참고하였습니다.*