본문 바로가기

Program/Oracle

[Oracle] Oracle SGA(System Global Area)

정성 가득한 글을 작성하신 원작자님께 감사드린다.

출처 : http://blog.naver.com/zoshstbt/50131544289



 



SGA(System Global Area)

Oracle Server의 Instance의 구성요소로, 여러 서버 프로세스들이 쿼리를 수행하기 위해 공유해서 사용하는 공간.


SGA의 전체 크기는 SGA_MAX_SIZE parameter 값에 의해 제한되며, 전체 메모리 범위 이상 설정되면 Database가 시작되지 않는다.

SGA_MAX_SIZE는 다음과 같은 명령으로 확인할 수 있다.

  • show parameter sga_max_size;

NAME TYPE VALUE

--------------- ------------ ---------

sga_max_size big integer 272M

  • Oracle 9i version 부터는 SGA 변경 후 재부팅 없이 즉시 적용가능하다.


메모리 할당 단위

  • Oracle에서는 메모리 할당 단위를 granule(그래뉼)이라는 단위로 메모리를 할당 및 해제한다.
    • SGA size가 1GB 이하 인 경우
      • 1 granule = 4MB
    • SGA size가 1GB 초과인 경우
      • 1 granule = 16MB
    • Oracle 9i 이하 version에서는 기준 size가 128MB 이다.



필수적인 요소 : Shared Pool, Database Buffer Cache, Redo Log Buffer

선택적인 요소 : Large Pool, Java Pool, Streams Pool(10g 전용)


구성요소


1. Shared Pool

Parse 단계에서 주로 사용되는 메모리 구조로서 Library Cache와 Dictionary Cache(Row Cache)로 구성된다.


Library Cache

  • soft parse를 수행할때 사용되는 공간으로 이미 수행되었던 sql 문장이나 pl/sql 문장, pl/sql 문장의 parse code, 실행계획 등이 저장되어 있다.
  • LRU(Least Resently Used) 알고리즘으로 관리된다.
    • 최근에 가장 사용빈도가 적은 것을 버리고 새로운 것을 채우는 방식
Dictionary Cache(Row Cache)
  • 구문 분석이나 옵티마이져가 실행계획을 세울 때 사용되는 주요 dictionary들이 저장되어 있다.
  • LRU(Least Resently Used) 알고리즘으로 관리된다.
  • 원래는 Database Buffer Cache에 존재하지만 많이 사용되는 것들만 Shared Pool에 복사된다.

Shared Pool의 크기는 SHARED_POOL_SIZE parameter의 값으로 결정되며, 다음과 같이 즉시 설정 및 확인할 수 있다.
  • alter system set shared_pool_size = 15M;
  • show parameter shared_pool_size;

NAME TYPE VALUE

------------------ ------------ ---------

shared_pool_size big integer 16M

  • 15MB를 설정하였는데 실제 설정된 size가 16MB로 나온 이유는 위에서 설명한 메모리 할당 단위때문이다.
    • 1 granule = 4M



2. Database Buffer Cache

수행되는 쿼리들의 필요한 실제 데이터를 보관하고 작업을 수행하는 공간으로, 모든 사용자가 수행하는 테이블 및 각종 오브젝트들이 존재해야 하는 곳이다. 만약 존재하지 않는다면 Server Process가 Disk의 Data File에서 해당 데이터가 포함된 block을 찾아서 Database Buffer Cache로 복사를 하게 된다.

* 실제 쿼리를 수행하기 위해서 직접 Disk의 Data File에 접근하여 필요한 데이터를 가지고 작업을 진행한다면 수행 속도가 매우느리기 때문에 해당 데이터 block을 Memory로 복사하여 작업을 진행하는 것이다.


Database Buffer Cache 또한 LRU(Least Recently Used) 알고리즘으로 관리되어, 오랫동안 사용되지 않은 block은 버려진다.


이때 Disk의 Data File로 부터 복사되는 block의 크기는 DB_BLOCK_SIZE parameter 값으로 결정되며, 한번 설정된 값은 Database를 재설치 하기 전까지는 변경할 수 없다.

  • Oracle 10g - 8K
  • Oracle 9i - 4K

Database Buffer Cache의 크기는 DB_CACHE_SIZE parameter 값으로 결정되며, 다음과 같은 명령으로 즉시 설정 및 확인할 수 있다.

  • alter system set db_cache_size = 72M;
  • show parameter db_cache_size;
NAME TYPE VALUE
---------------- ------------- ---------
db_cache_size big integer 72M

Database Buffer Cache block의 상태
  • Pinned Buffer
    • Server Process가 현재 block을 사용중임을 나타냄
    • 덮어쓰면 안되는 상태
  • Dirty Buffer
    • Server Process가 데이터를 변경은 하였지만 저장은 되지 않은 상태
      • commit이 된 상태이지만 check point(DBWR로 하여금 데이터를 파일에 쓰라고 명령하는 시그널)가 발생되지 않아서 저장되지 않은 상태를 말함
    • 절대로 덮어쓰면 안되는 Buffer의 상태
  • Free Buffer
    • 사용되지 않았거나, 변경사항이 Data File에 저장이 완료된 상태
    • 덮어써도 되는 상태
  • Server Process는 Free Buffer가 부족한 경우 DBWR에게 check point 명령을 발생하도록 하여, Dirty Buffer의 내용이 Data File에 쓰여 지도록 한다.



3. Redo Log Buffer

Redo Log Buffer의 가장 중요한 목적은 Database 복구를 위한 것이다.

  • Database에 변경되는 모든 사항들이 모두 기록되며, 장애가 발생하는 경우 기록된 내용을 보고 복구를 진핼 할 수 있다.
Redo Log Buffer에 기록되는 기록되는 내용은 redo entries라고 부르며, redo entries에는 향후 장애로 인한 복구가 필요할 때, 필요한 복구관련 정보가 저장되어 있다.

Redo Log Buffer의 크기는 LOG_BUFFER parameter 값으로 결정되며, 다이나믹 기능을 사용할 수 없기 때문에 설정 후 Database 재부팅이을 해야지 적용된다.



4. Large Pool

백업 / 복구 작업시 사용됨


5. Java Pool

거의 사용되지 않음



출처 : http://blog.naver.com/zoshstbt/50131544289