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 모두 자동 조정하는 방식