티스토리 뷰

SMALL
 Oracle 메모리 구조는 SGA (System Global Area)와 PGA (Program Global Area)로 구성된다.

 SGA (System Global Area)


- Oracle의 인스턴스에 대한 데이터와 컨트롤 정보를 가지는 공유 메모리 영역의 집합 (SGA는 동적이다.)
   (Oracle이 상주하는 컴퓨터의 가상메모리에 할당)
SQL> show sga;     <- SGA 메모리 할당 상태 확인
Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              75499088 bytes
Database Buffers          205520896 bytes
Redo Buffers                2973696 bytes

 - Oracle9i부터 동적SGA는 인스턴스를 종료하지 않고 SGA 구성을 변경할 수 있다.
 - SGA_MAX_SIZE 파라미터로 크기를 조정한다.
 + SGA 구성 요소를 통해 Granule에 할당되고 추적된다.
  - Granule : 연속적인 가상 메모리 할당 단위. Granule의 크기는 예상되는 총 SGA 크기에 따라 다르다.
    (예상 SGA 크기가 128M보다 작은 경우에는 4M, 그 외에는 16M)
  - Database Buffer Cache 및 Shared Pool은 Granule 단위에 따라 늘어나거나 줄어든다.
  - Database buffer cache, Redo log buffer, Shared pool, Large pool, Java pool, Streams pool 로 구성 

 + SGA 크기에 가장 많은 영향을 주는 파라미터?
  - DB_CACHE_SIZE : 표준 블록의 캐시 크기 (기본값은 UNIX: 48M, NT: 52M)
  - LOG_BUFFER : Redo log buffer에 할당되는 바이트 수
  - SHARED_POOL_SIZE : 공유 SQL 및 PL/SQL에 제공되는 영역의 바이트 크기 (기본적으로 16M, 64bit인 경우는 64M)
  - LARGE_POOL_SIZE : 대용량 풀의 크기 (기본값은 0)
  - JAVA_POOL_SIZE : Java 풀의 크기 (기본값은 24M)
 * SGA의 크기는 (SGA_MAX_SIZE) - (DB_CACHE_SIZE) - (LOG_BUFFER) - (SHARED_POOL_SIZE) 
    - (LARGE_POOL_SIZE) - (JAVA_POOL_SIZE)를 초과할 수 없다.

1. 공유 풀 (Shared Pool)
 - 가장 최근에 실행한 SQL문이나 데이터 정의를 저장하는데 사용된다.
 - Library Cache와 Data Dictionary Cache로 구성된다. 
 - 전체 SGA 킈는 SGA_MAX_SIZE를 초과할 수 없다.
 - Shared_Pool_Size 파라미터 값으로 크기를 조정한다. 
SQL> show parameter shared_pool_size;                   <-- shared_pool_size 값 확인

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size                     big integer 0

SQL> alter system set shared_pool_size = 64m;            <--  shared_pool_size 값 변경
System altered.
SQL> show parameter shared_pool_size;                     <-- 변경된 shared_pool_size 값 확인

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size                     big integer 64M

1.1 라이브러리 캐시 (Library Cache)
 - 가장 최근에 사용한 SQL문과 PL/SQL문, 구문 분석 트리, 실행계획에 대한 정보가 저장한다.
 - LRU (Least Recently Used) 알고리즘으로 관리된다.
   (Shared Pool의 크기가 너무 작으면 명령문이 라이브러리 캐시로 계속 재로드되어 성능이 떨어진다.)
 + Shared SQL 영역과 Shared PL/SQL 영역으로 구분된다.
  + Shared SQL 영역 
   - SQL문장에 대한 실행계획과 파싱 트리를 저장하고 공유한다.
   - 다음에 동일한 SQL문을 실행할 때에는 Shared Pool에 있는 구문 분석 정보를 이용하여 신속하게 처리할 수 있다.
   - SQL문에서 필요할 때마다 공유 SQL영역을 사용할 수 있게 하려면 텍스트, 스키마, 바인드 변수가 동일해야 한다.
  + Shared PL/SQL 영역
   - 최근에 실행된 PL/SQL문을 저장하고 공유한다.
   - 구문 분석되고 컴파일된 프로그램 단위와 프로시저(함수, 패키지, 트리거)가 저장된다.

1.2 데이터 딕셔너리 캐시 (Data Dictionary Cache)
 - 데이터베이스 파일, 테이블, 인덱스, 컬럼, 사용자 권한 등 가장 최근에 사용된 데이터 사전의 정보를 저장한다.
 - 구문분석 단계에서 서버 프로세스는 데이터 딕셔너리에서 정보를 찾아 객체 이름을 해석하고 액세스를 확인한다.
 - 데이터 딕셔너리 정보를 메모리에 캐시하면 질의와 DML에 대한 응답시간이 줄어든다.
 - Shared Pool 크기 조정에 따라 Data Dictionary Cache의 크기가 결정된다.
 - Data Dictionary 정보를 Database buffer cache와 Shared Pool 메모리에 다중 캐시하여 성능을 향상시킬 수 있다.

2. 데이터베이스 버퍼 캐시 (Database Buffer Cache)
 - 데이터 파일에서 검색된 데이터 블록의 복사본을 저장한다.
 - 디스크에 완전히 쓰여지지 않는 수정된 데이터를 보유할 수도 있다.
 - LRU 알고리즘을 통해 관리된다.
 - 데이터를 얻거나 갱신할 때 성능이 크게 향상된다.
 - DB_BLOCK_SIZE는 SYSTEM 테이블스페이스에서 사용되는 기본 블록의 크기를 결정
   (데이터베이스 버퍼 캐시에 있는 각 버퍼의 크기는 Oracle 블록의 크기가 동일)
 
 + Sub Cache 구성 - Database Buffer Cache의 크기를 정의
  - DB_CACHE_SIZE : 디폴투 버퍼 캐시의 크기만 조정. 이 값은 0으로 설정할 수 없고, 반드시 존재해야 한다.
  - DB_KEEP_CAHCE_SIZE : Keep Buffer Cache의 크기를 조정. 재사용될 메모리 블록을 고정적으로 저장하는데 사용
  - DB_RECYCLE_CACHE_SIZE : Recycle Buffer Cache의 크기를 조정. 거의 재사용되지 않을 메모리블록을 제거하는데 사용

 -  독립된 Sub Cache는 동적으로 크기를 변경할 수 있다.
SQL> alter system set db_cache_size = 96m;
SQL> alter system set db_keep_cache_size = 16m;
SQL> alter system set db_recycle_cache_size = 16m;

 - DB_CACHE_ADVICE는 다양한 캐시 크기의 작업을 예측하기 위한 통계를 수집하도록 설정된다.
    (수집된 버퍼 캐시 권고 정보는 V$DB_CACHE_ADVICE 뷰는 통계를 표시된다.)
 + DB_CACHE_ADVICE 파라미터는 동적으로 크기를 변경할 수 있으며 OFF, ON, READY 3가지 값을 사용할 수 있다.
  - OFF : 권고가 해제되고 권고에 대한 메모리가 할당되지 않는다.
  - ON : 권소가 설정되고 CPU 및 메모리 오버헤드가 모두 발생한다.
  - READY : 권고가 해제되지만 권고에 대한 메모리는 할당된 상태로 유지된다.

3. 리두 로그 버퍼 (Redo Log Buffer)
 - 데이터베이스 데이터 블록의 모든 변경 사항(리두 항목)을 기록하는 Circular(순환) Buffer 이다. (LGWR에 의해 저장된다.)
 - 리두 항목에는 변경 사항을 재구성하거나 재실행할 정보가 포함되어 있다. 
   (insert, update, delete, create, alter, drop 작업에 의해 변경되기 전의 데이터를 재생성해야 하는 정보가 포함된다.)
 - Redo Log Buffer의 기본 목적은 '복구'이다.
 - Redo Log Buffer의 크기는 LOG_BUFFER로 정의된다.

4. 대용량 풀 (Large Pool)
 - SGA의 선택적 메모리 영역으로, Shared Pool의 부담을 줄인다.
 - LARGE_POOL_SIZE로 크기가 조정된다.
 + 용도 : 공유 서버의 세션 메모리 (UGA), I/O 서버 프로세스, 백업 및 복원 작업 또는 RMAN, 병렬 실행 메시지 버퍼 
  + 백업 및 복원
   - RMAN이 BACKUP_DISK_IO = n 및 BACKUP_TAPE_IO_SLAVE = TRUE 파라미터가 설정된 경우 Large Pool 사용
   - Large Pool이 구성되어도 크기가 충분하지 않으면 Large Pool에서 메모리를 할당할 수 없다.
   - RMAN은 오유 메시지를 경고 로그 파일에 쓰며 백업 또는 복원을 위해 I/O슬래이브를 사용하지 않는다.
  - 병렬 실행 : PARALLEL_AUTOMATIC_TUNING이 TURE로 설정되면 Large Pool이 사용되고 아니면 Shared Pool에 할당.
 
5. 자바 풀 (Java Pool)
 - Java로 작성된 프로그램을 실행할 때 실행 계획을 저장하는 영역이다.
 - JAVA_POOL_SIZE 파라미터에 의해 바이트 단위로 크기가 조정되며 기본 크기는 24MB이다.

6. Stream Pool
 - 데이터베이스 사이에 stream을 통한 정보 공유를 위한 영역
 - stream 공간이 필요하게 되면 shared pool의 10%까지 할당하여 사용한다.
 - STREAM_POOL_SIZE에 의해 크기가 조정된다.


 PGA (Program Global Area)

 - Oracle 데이터베이스에 접속하는 각 사용자 프로세스를 위해 예약된 메모리 공간이다.
 - 단일 프로세스 또는 단일 백그라운드 프로세스의 정보를 제어하는 메모리 영역이다.
 - 프로세스가 생성될 때 할당되고 프로세스가 종료될 때 할당이 해제된다. 
 - 여러 프로세스가 공유하는 SGA와 달리 PGA는 단 하나의 프로세스가 사용하는 영역이다.
LIST
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함