1. Oracle 서버 전체구조.

- 인스턴스: 메모리 부분에 생성되는 구조 

- 데이터베이스: 데이터파일, Control file, Redo log File



2. SGA 구성요소.

1) DB Buffer Cache

  - 데이터의 조회와 변경 등의 실제 작업이 일어나는 공간.

  - 조회나 변경을 원하는 데이터들은 모두 DB Buffer cache에 내용이 존재해야하며, 없는 경우 데이터파일에서 해당 내용이 들어있는 블럭을 복사해 가져와야함.

  - 디스크 I/O 보다 메모리에서 작업속도가 빠르기 때문.


  1-1) Buffer Block 상태.

   - Pinned Buffer : 다른 사용자가 현재 사용하고있는 Buffer 블록.

   - Dirty Buffer   :  현재 작업은 진행되지 않지만, 다른 사용자가 내용을 변경한 후 아직 데이터파일에 변경된 내용을 저장하지 않은 Buffer.

   - Free Buffer    :  사용할 수 있는 버퍼로써 사용되지않은 버퍼 이거나, Dirty buffer이었다가 하드디스크에 저장이 완료되어 재사용할 수 있는 블록.

  

  1-2) Buffer 상태 관리방법.

    - LRU List : 가장 최근까지 많이 사용된것은 지키고 가장 사용이 안 된 것은 덮어씀.

    - LRU list는 스캔 효율성을 높이기 위해 LRU 리스트와 LRUW 리스트로 사용.

    - LRU List + LRUW List를 Working set 이라고 부름.

    * LRU List 

       - 메인리스트 : 사용된 Buffer들의 리스트. Hot 영역, Cold 영역으로 나뉨.

       - 보조리스트 : 미사용된 Buffer들이나, DBWR에 의해 기록된 버퍼들의 리스트.

    *  LRUW List

       - 메인리스트 : 변경된 Buffer들의 리스트 (Dirty List)

       - 보조리스트 : 현재 DBWR 들이나, DBWR에 의해 기록된 Buffer들의 리스트.

 

  1-3) 사용자가 데이터 파일을 DB Buffer Cache로 가져오는 경우.

    1 )  DB Buffer cache에서 Free 상태의 버퍼를 확보.

    2)  확보하기위해 LRU 리스트의 보조리스트에서 Free Buffer 찾는다.

    3)  보조리스트의 Free Buffer가 모두 사용된 경우 메인리스트의 Cold영역 에서 Free List를 찾는다.

    4)  cold 영역에서 Free Buffer 찾다가 10g 기준 40%만큼 찾았는데 없는 경우 Scan을 멈추고 DBWR에게 Dirty Buffer를 내려쓰도록 요청.

    5)  파일로 저장이 완료된 Dirty Buffer는 Buffer 상태가 Free Buffer로 변경되어 LRU list의 보조리스트에 추가됨.


2) Redo Log Buffer 

- 데이터의 변경사항이 생길 경우 해당 변경내용을 기록해두는 역할. (DDL, DML, TCL 같은 작업 시)

- 장애 발생 시 복구를 하기위함.

- Redo Log Buffer : 변경된 내용을 기록하는 메모리공간

- Redo Log File     :  Redo Log Buffer의 내용을 디스크에 저장해주는 파일.


3) Shared Pool

- Library cache와 Dictionary cache등으로 구성.



3-1) Library Cache : Soft Parse 할 때 사용되는 공간.

 - 이미 수행했던 SQL 문장이나, PL/SQL 문장의 Parse Code와 해당 SQL/PLSQL 문장, 실행계획 등이 저장됨.

 - LRU 알고리즘으로 관리됨.

3-2) Dictionary Cache : 구문분석이나, 옵티마이저가 실행계획 세울 때 사용되는 주요 Dictionary들이 Row 단위로 Cache 되어있음.

 - LRU 알고리즘으로 관리됨.

3-3) Server Result Cache : 결과값을 Cache해 두는 공간.

- 11g 부터 도입됨.

- SQL 수행 결과를 저장해 두었다가, 동일한 SQL이 수행될 경우 DB Buffer cache를 거치지않고 즉시 Server Result Cache에서 가져가도록 하여 속도를 높임.

3-4) Large Pool

- 필수 구성요소는 아니며, 특정 기능을 사용할 경우에만 쓰는 SGA 구성요소.

-  Shared Server모드로 Oracle Server를 운영하는 경우 UGA를 이곳에 생성.

- 병렬처리 작업을 할 경우 각 Process들간의 Message Buffer가 생성되는곳. 

- RMAN 백업이나 복구를 할 경우 RMAN이 사용하는 I/O용 Buffer가 이곳에 생성됨.

- LRU알고리즘으로 관리되지 않음.

3-5) JAVA Pool

- 필수 구성요소는 아니며, JAVA관련 코드나 JVM관련 데이터를 저장하기 위해 생성되는 선택적인 공간.

3-6) Streams Pool

- 10g 버전이후 생긴 SGA 구성요소.

- Streams 기능을 사용할 경우 사용됨.

- Streams 기능을 사용하게 되면 동적으로 Oracle Streams가 그 크기를 증가시킴.

3-7) Fixed SGA

- Oracle이 내부적으로 사용하기 위해 생성시키는 공간.

- 백그라운드 Process들이 필요한 Database의 전반적인 공유 정보나 각 Process들이 공유해야만 하는 Lock 정보 같은 내용들이 저장됨.

- Oracle 시작 시 자동으로 설정되며, 사용자나 관리자가 임의로 변경할 수 없음.

 

4) Dynamic SGA 기능.

- 9i 이후 도입된 개념으로 관리자의 필요에 의해 SGA 구성요소의 크기를 변경한 경우 Oracle Instance의 재기동 없이 즉시 적용이 가능해짐.(Redo Log Buffer를 포함한 몇가지 제외)

- 변경되는 크기는 그래뉼 이라는 단위를 통해 변경됨.


SQL> show sga

Total System Global Area  313159680 bytes

Fixed Size                              2212936 bytes

Variable Size                       167775160 bytes

Database Buffers               138412032 bytes

Redo Buffers                         4759552 bytes


- Total System Global Area : 전체 SGA 양을 의미.

- Fixed Size     : Background Process들이 사용하는 공간.

- Variable Size : Shared Pool, Lagre Pool, Java Pool로 사용되는 공간.

- Database Buffers: DB Buffer Cache 사용되는 공간.

- Redo buffers : Redo Log Buffer로 사용될 공간.


5) Program Global Area(PGA)

- 각 Process들이 사용하는 메모리 공간.

- Oracle Server내에서 동작하는 모든 Process는 각각 PGA를 갖고있음.

- 주로 정렬관련 작업등이 이루어짐.

- 적당한 PGA용량 계산방법.

* OLTP 환경 

  PGA_AGGREGATE_TALGET = (( 총 물리 메모리 용량 * 80%) * 20%)

* DSS 환경

* PGA_AGGREGATE_TALGET = (( 총 물리 메모리 용량 * 80%) * 50%)


 5-1) Private SQL Area

-  사용자가 SQL  문장 실행 시 User Process가 Server Process에게 해당 쿼리를 전달.

-  Server Process는 자신에게 작업을 요청한 User Process의 정보를 Session Memory 부분에 저장 후 해당 SQL Parse 작업 수행.

-  해당 SQL에 Bind 변수가 있을 경우, Bind 변수 값을  Private SQL Area에 보관하고 Query의 실행 상태정보와 query를 수행하며 임시로 정보를 저장해야하는 경우 이 공간 사용.

 - Persistent Area : Bind 변수 값을 저장해 두는 공간.

 - Runtime Area   : SQL 문장을 수행하는 도중 데이터를 임시로 저장해야 할 경우 사용하는 공간. 

                               ex) DB Buffer Cache에서 PGA로 Fetch가 다 되어야만 출력이 가능한데 100만 건의 테이블을 조회하여 데이터를 모두 출력해야 할 경우,

                                 100건 모두가 Fetch 될 때 까지 Runtime Area에서 모음. 

5-2) SQL Work Area.

- Sort 작업이나 Hash 관련 작업이 있을 경우 수행되는 공간.

- 8i 까지 수동으로 관리 했으나 9i부터 자동으로 관리하는 방법이 등장.

- PGA_AGGREGATE_TAGET의 값을 설정한 후 WORKAREA_SIZE POLICY를 AUTO로 설정하면 PGA 구성요소의 크기를 Oracle Server가 동적으로 관리.