4.2.1 Fixed SGA
- SGA의 하나의 구성 요소
- 버전에 따라 크기가 다르다.
- 여러 파라미터 값을 담은 변수와 SGA의 다른 구성 요소를 가리키는 변수 집합을 저장하고 관리함.
- SGA의 다른 비트 혹은 조각을 찾기 위해 오라클이 내부적으로 사용하는 영역
4.2.2 리두 버퍼
- 온라인 리두 로그를 작성하기 위해 필요한 데이터를 임시로 저장하는 공간
- 리두의 내용을 디스크에 쓰기전에 보관하는 영역
- LGWR이 아래의 시나리오 중 하나에 해당될 경우, 디스크에 작성한다.
- 매 3초 마다
- 커밋할 때 마다
- LGWR에 로그 파일 스위치 요청이 있는 경우
- 로그 버퍼가 1/3 찼거나 로그 버퍼에 리두 로그 데이터의 크기가 1MB가 됐을 때
- LOG_BUFFER
- 리두 버퍼의 기본 크기를 나타낸다.
- 이 값은 OS 종속적이다.
SQL> select value, isdefault from v$parameter where name = 'log_buffer';
VALUE
--------------------------------------------------------------------------------
ISDEFAULT
---------
19580928
TRUE
4.2.3 블록 버퍼 캐쉬
- 디스크로 쓰기 전, 그리고, 디스크로 부터 읽은 후의 데이터 베이스 블록의 정보를 저장하는 공간
- 가장 중요한 SGA 영역
- 3개의 공간으로 나뉨
- Default pool
- 모든 세그먼트 블록들이 일반적으로 저장되는 공간
- 단일 버퍼 캐쉬 영역의 버퍼 풀 영역을 말한다.
- Keep pool
- 주기적으로 자주 접근되는 세그먼트를 여기에 할당
- 다른 세그먼트가 공간을 요구하면 오래된 블록은 default pool로 밀려난다.
- Recycle pool
- 주기적으로 큰 세그먼트를 아주 무작위로 접근해서 다른 블럭들을 밀려나게 할 가능성이 있는 경우 여기에 할당함.
- 3개의 공간은 각각의 고유한 방식으로 블록을 관리한다.
블록 관리 방법
- warm 세그먼트들을 keep pool에 할당하라.
- 캐쉬에 저장하고 싶지 않은 세그먼트들은 recycle pool에 할당한다.
- 오라클 9i부터 다중 블럭 크기 지원 및 캐쉬 가능
4.2.3.1 버퍼 캐시 안에서 블록 관리하기
리스트 종류
- dirty 블럭 리스트
- non-dirty 블럭 리스트
확인할 수 있는 테이블
- X$BH
- 블록 버퍼 캐시 안에 있는 블록들에 대한 정보를 확인 가능
- DBA_OBJECTS 와 조인하여 정보 조회 가능
- V$BH 보다 많은 정보를 가지고 있다.
4.2.3.2 다중 블록 크기
- 오라클 9i부터 하나의 데이터베이스에서 복수의 데이터베이스 블록 크기를 사용할 수 있다.
- 버퍼 pool이 각각의 다른 크기의 블록을 담을 수 있게 설정해야 한다.
- 파라메터 이름은 db_Nk_cache_size로 사용된다.
- 다중 블럭 크기로 섬세한 튜닝도 가능하지만, 주된 목적은 블록 크기가 다른 데이터베이스 간 데이터 이전이 주된 목적이다.
4.2.4 Shared Pool
- SGA 메모리 에서 성능과 가용성 측면에서 핵심적인 부분
- 이 크기가 너무 작으면 장애가 발생한 것처럼 성능이 저하될 수 있다.
- 이 영역은 많은 '프로그램' 데이터 조각을 캐시하는 곳
- 쿼리의 파싱 정보, PL/SQL 코드, 시스템 파라미터 정보, 데이터 딕셔너리 캐쉬 정보 등이 저장됨
- 작은 수많은 청크들로 구성됨
- LRU 알고리즘을 기반으로 관리됨
- DBMS_SHARED_POOL 내장 패키지를 이용하여 shared pool의 동작 방식을 변경할 수 있다.
- 바인드 변수를 사용하지 않으면 shared pool 데이터는 망가진다.
- 시스템은 쿼리를 파싱하는데 상당한 리소스를 사용한다.
- 바인드 변수를 사용하지 않으면 쿼리 재사용성이 떨어진다.
- oracle 11g memory_target 방식 시 예제
SQL> select sum(bytes) from v$sgastat where pool='shared pool';
SUM(BYTES)
----------
989860536
SQL> show parameter shared_pool_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 0
SQL>
4.2.5 Large Pool
- 힙 방식으로 메모리 할당이 이루어 지고, malloc()과 free()함수를 사용한다.
- shared mode에서 SGA영역에 UGA를 할당할때 사용한다.
- 병렬 작업 시 parallel query server의 coordinator가 사용하는 interprocess message buffer를 할당 할 때 사용
- RMAN disk I/O 버퍼의 백업
4.2.6 Java Pool
- DB내의 자바 프로그램의 실행을 돕기 위해 추가된 영역
- JAVA_POOL_SIZE를 이용해서 지정한 메모리는 지정된 모든 세션에 자바 코드와 데이터를 위해 java pool에 할당된다.
dedicated mode
- 각 세션이 실제로 이용하는 각각의 자바 클래스의 공유 파트를 포함한다.
- 이 정보는 SGA영역을 사용하지 않고, UGA에 저장된다.
shared mode
- 각 자바 클래스의 공유 부분
- 각각의 세션에서 각 세션의 상태에 사용하는 UGA의 어떤 것.
- UGA의 나머지는 shared pool의 일반적인 사항과 같이 위치하거나, large pool이 설정되어있다면 이것 대신에 위치할 수 있다.
4.2.7 Stream Pool
- 오라클 10g에서 시작된 새로운 SGA 구조
- 하나의 데이터베이스에서 다른 데이터베이스로 데이터를 이동하는 stream process에 필요한 buffer queue message에 사용되는 영역
4.2.8 자동 SGA 메모리 관리
- 오라클 10g에서 추가된 방식
- SGA_TARGET
- SGA_MAX_SIZE 까지 설정된 크기까지 조정가능
- 파라메터 구분
- 자동 조정 파라메터 : DB_CACHE_SIZE, SHARED_POOL_SIZE, LARGE_POOL_SIZE, JAVA_POOL_SIZE
- 수동 SGA 파라메터 : LOG_BUFFER, STREAMS_POOL, DB_NK_CACHE_SIZE, DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SIZE
- V$SGAINFO를 통해 설정된 값 확인 가능
- 인스턴스의 메모리 요구사항이 파악되면 각 구성 요소 값은 어느 정도 고정된다.
- 전체 메모리 관리는 SGA_TARGET과 PGA_AGGREGATE_TARGET으로 가능
4.2.9 자동 메모리 관리
- 오라클 11g에서 추가된 방식
- MEMORY_TARGET으로 모든 메모리 설정값을 대신함.
- SGA, PGA 모두 자동 조정하는 방식