ORACLE Database / WAS (iAS) / SQL 자료실 - 포기하지 않으면 실패하지 않는다!
Vote Reply Modify Delete Forward Prev Next List

  Author   : 조성환 [ ladmin ] Vote: 2162, Modifies: 1, Hit: 5579, Lines: 219, Category: Etc.
SGA 크기를 결정하는 방법 (7.x, 8.0.x, 8i, 9i)

PURPOSE
--------
이 문서는 SGA의 적절한 크기를 산정하는 방법을 기술하는데 목적이 있다.



Explanation
---------
이 부분에서는 Oracle8, Oracle8i, Oracle9i에 대한 산정방법을 먼저 기술한다.
Oracle7에 대한 내용은 문서 후반에 별도로 기술한다.


1. SGA 크기를 살펴보는 방법

SGA 크기에 대한 정보는 데이터베이스 구동 시 표시된다.
이 정보는 sqlplus 나 svrmgrl 에서도 살펴 볼 수 있다.

8.0.X
- svrmgrl
  connect internal
  show sga

8.1.X
- svrmgrl or sqlplus /nolog
  connect internal
  show sga

9.X
- sqlplus

SQL*Plus: Release 9.0.1.0.0 - Production on Thu Aug 23 15:40:29 2001
(c) Copyright 2001 Oracle Corporation.  All rights reserved.
Enter user-name: sys as sysdba
Enter password:

Connected to:
Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production
With the Partitioning option
JServer Release 9.0.1.0.0 - Production

SQL> show sga
Total System Global Area   72123504 bytes
Fixed Size                   279664 bytes
Variable Size              67108864 bytes
Database Buffers            4194304 bytes
Redo Buffers                 540672 bytes


2 SGA를 구성하는 영역

다음은 svrmgrl SHOW SGA 실행 예이다:

Total System Global Area   23460696 bytes
Fixed Size                    72536 bytes
Variable Size              22900736 bytes
Database Buffers             409600 bytes
Redo Buffers                  77824 bytes

Total System Global Area
- SGA를 구성하는 영역 크기의 합계 (byte 단위)

Fixed Size
- 데이터베이스나 인스턴스의 상태를 저장하는 영역으로, 백그라운드 프로세스가 액세스 하는 영역
- 사용자 데이터는 저장되지 않음
- 일반적으로 100k 미만의 영역을 차지함

Variable Size
- 이 영역의 크기는 init.ora 파일의 다음 파라미터로 부터 영향을 받는다.
    shared_pool_size
    large_pool_size
    java_pool_size
- 버전 별 내용에 대해서는 이 문서의 'SGA 크기 산정' 부문에 기술되어 있다.

Database Buffers
- 데이터파일로부터 읽어 들인 데이터 블록 내용을 저장하는 영역.
  size = db_block_buffers * block size

Redo Buffers
- SGA 내의 circular buffer로서, 데이터베이스에 가해진 변경 사항에 대한 내역을 저장하는 영역.
- 최소 값은 데이터베이스 블록 크기의 4배 이상으로 지정됨.

3. SGA 크기 산정

8.0.X

 SGA 크기를 산정하기 위해서는 다음과 같은 공식을 사용한다.

   ((db_block_buffers * block size) +
   (shared_pool_size + large_pool_size + log_buffers) + 1MB


8.1.X

 SGA 크기를 산정하기 위해서는 다음과 같은 공식을 사용한다.

   ((db_block_buffers * block size) +
   (shared_pool_size + large_pool_size + java_pool_size + log_buffers) + 1MB

9.X
 오라클 9i에서는, SGA가 이전 버전처럼 정적으로 구성될 수도 있고, 동적으로 바뀔 수 있고 구성할 수 도 있다.

 동적으로 SGA 크기를 변경할 수 있도록 지정한 경우, 다음과 같은 데이터베이스 초기화 파라미터에 의해 결정된다
: DB_BLOCK_SIZE, DB_CACHE_SIZE, SHARED_POOL_SIZE, LOG_BUFFER.

 오라클 9i부터, SGA의 크기는 동적으로 바꿀 수 있다.
이것은, 다음 파라미터를 사용하여 SGA 크기를 인스턴스 실행 중에도 바꿀 수 있다는 것을 의미한다.

    Buffer cache (DB_CACHE_SIZE) -- standard block의 cache 크기 (byte 단위)

    Shared pool (SHARED _POOL_SIZE) -- shared SQL과 PL/SQL 문장을 저장하기                                        위한 공간의 크기 (byte 단위)
    Large pool (LARGE_POOL_SIZE) (기본값: 0 bytes) -- large pool의 크기로 large pool은 shared server의 session memory, message buffer에 대한 병렬 처리 등에 사용되는 시스템 영역이며, disk I/O buffer의 backup 및 restore 처리에 의해 사용되기도 한다.

 LOG_BUFFER 파라미터는, redo entry를 redo log 파일로 기록하는 과정에서   buffering하는데 사용된다. LOG_BUFFER 파라미터는 정적인 파라미터로 SGA의 적은 부문을 차지 하며, 데이터베이스를 SHUTDOWN 시킨 후 재 구동 시킬 때만 init.ora 파일로부터 변경된 값을 읽어 들여 반영이 된다.

 MAX_SGA_SIZE 파라미터를 동적으로 바꿀 수는 없으나, SGA를 구성하는 부문의 크기를 동적으로 바꿀 수 있다.
DB_CACHE_SIZE, SHARED_POOL_SIZE, LARGE_POOL_SIZE 크기를 데이터베이스 운영 중간에도, 바꿀 수 있다.

 (참고:  LARGE_POOL_SIZE 는 Oracle 9.0.1에서는 값을 동적으로 바꿀 수 없으며, 후속 버전에서 적용될 예정이다)

 최적의 cache 크기를 유지하기 위해서, DB_CACHE_ADVICE 파라미터 (동적 파라미터) 를 이용하여, cache 크기의 변화에 따른, 변동 사항을 V$DB_CACHE_ADVICE 뷰를 통해 조회할 수 있다.

 DB_CACHE_ADVICE 파라미터는 ALTER SYSTEM......SET 절을 사용하여, 동작하게 설정할 수 있다.

 이 파라미터에 대한 자세한 설명은 Oracle 9i Database performance Guide에 자세히 기술되어 있다.


 Oracle 9i부터, 테이블스페이스를 서로 다른 block size로 만들 수 있는 기능 및, 각 block size별 cache의 크기를 지정하는 기능이 추가 되었다.
SYSTEM 테이블스페이스는, 데이터베이스의 표준 block size를 사용하며, 다른 테이블스페이스는, 4종류까지의 서로 다른 block size를 사용할 수 있다.

 표준 block size는 DB_BLOCK_SIZE 파라미터에 의해 지정되며, 그 블록에 대한 cache 크기는, DB_CACHE_SIZE 파라미터에 의해 지정된다. 표준 이외의 block size는 CREATE TABLESPACE 문장의 BLOCKSIZE 절에 의해 지정할 수 있다.
표준 이외 block size별 cache의 크기는, DB_nK_CACHE_SIZE 파라미터에 의해 지정되며, 여기서 n은 2, 4, 8, 16, 또는 32 Kbytes 가 될 수 있다.

 표준 block size, 또는 기본 block size는 일반적으로 OS의 시스템 block size와 동일한 크기 또는, 그 배수로 지정한다.

DB_CACHE_SIZE 파라미터 - DEFAULT cache size - 는 표준 block size에 대한 cache의 크기를 지정한다.
(기본은 48MB 으로 지정됨) 시스템 테이블스페이스는 표준 block size로 생성이 되며, DEFAULT cache size를 사용하게 된다.

 표준 block size이거나, 표준 이외의 block size 이거나, 그리고 각 block size별 cache는 동일한 크기의 block size를 사용하는 어떤 테이블스페이스에 의해서도 사용될 수 있다.
  
만약, 데이터베이스를 디자인 할 때, 다중 block size를 고려한다면, DB_CACHE_SIZE 이외에도, 사용하고자 하는 block size에 대한 DB_nK_CACHE_SIZE 값을 지정하여야 한다.
 
사용하고자 하는 모든 block size에 대해, 각각의 cache의 크기를 지정해 주어야 한다.

이와 같이 block size 별 cache 크기 지정을 하는 방법은, 4개까지의 표준 이외의 block size를 사용하는 테이블스페이스를 데이터베이스에서 액세스 할 수 있게 함으로써, block size별 목적에 맞는 cache 크기를 상세하게 지정할 수 있게 해 준다.


 DB_BLOCK_SIZE 값은 데이터베이스를 생성할 때만 지정 가능하고, 한번 생성된 데이터베이스에 대해서는 그 값을 바꿀 수 없으므로, 초기에 값을 정할 때 신중하게 결정하여야 한다.

 SGA 크기를 산정하기 위해서는 다음과 같은 공식을 사용한다.

 DB_CACHE_SIZE + DB_KEEP_CACHE_SIZE + DB_RECYCLE_CACHE_SIZE + DB_nk_CACHE_SIZE + SHARED_POOL_SIZE + LARGE_POOL_SIZE + JAVA_POOL_SIZE + LOG_BUFFERS + 1MB

 참고: 사용중인 각각의 DB_nk_CACHE_SIZE 크기를 더해야 한다.        DB_nk_CACHE_SIZE는 (2, 4, 8, 16, 32k) 블록에 대해 4개까지 지정 가능하다. 이중 하나는 기본 block size로 지정 될 것이고, 그 크기는 DB_CACHE_SIZE에 별도로 지정하게 된다.


4. 추가 정보

1) SHOW SGA 명령을 통해 나타나는 Redo Buffer의 크기는 init.ora 파일의 log_buffer 파라미터에 지정된 값과는 다른 값이 나타난다.

2) Redo Buffer의 크기는 데이터베이스가 실행되는 O/S의 block size의 최소한 4배 이상의 크기가 지정 되어야 한다.

3) Java_pool_size는 SHOW SGA 명령이나, V$SGA 뷰 조회시 감안되지 않는 문제는 Oracle 8.1.6 에서 해결되었다.

4) Oracle 8.1.5에서는 Java_pool_size와 관련된 제약사항이 존재한다.
기본 값은 20000K로 지정이 되어 있는데, 이 값을 최소한 1000K 이상으로 지정하지 않으면, 데이터베이스 구동 시 ORA-01078 "failure in processing initialization parameters" 라는 에러가 발생하게 된다.

5) Oracle 8.1.6에서는 Java_pool_size와 관련된 제약사항이 존재한다.
기본 값은 20000K이며, init.ora 파일에 원하는 값을 지정할 수 있으나 최소 32768 이상으로 지정되어야 한다.


5. Oracle 7에서 SGA 크기를 산정하는 방법과, 사용중인 SGA 크기 확인 SGA의 개략적인 크기는 다음과 같은 공식을 사용하여 산정할 수 있다.

 ((db_block_buffers * block size) + shared_pool_size + log_buffers) /.9

예 (HP-UX 9000 장비 Oracle 7.0.16):

     init<SID>.ora 에 다음 사항이 기술됨.
     DB_BLOCK_BUFFERS = 200
     LOG_BUFFERS = 8192
     SHARED_POOL_SIZE = 3500000

default Block Size = 2048 byte 로 지정되어 있을 때

     db_block_buffers * block size + shared_pool_size + log_buffers
     ((200       *   2048)    + 3500000          + 8192) / .9

     409600 + 3500000 + 8192 = 3917792 bytes / 0.9

     = 4,353,102 bytes (4M)

여기서 0.9로 나누는 이유는, SGA의 가변 부분을 고려해야 하기 때문이다.
이것은 정확한 값을 예상하는데 사용되는 값이다. 위 공식을 통해 예상된 값은 4353102 byte 였으나, 다음 예를 보면, 실제 값은 4504072 byte 인 것을 알 수 있다.

SGA의 실제 크기를 확인하기 위해서는 다음과 같은 명령을 sqldba 또는 svrmgrl에서 수행 시켜야 한다.


7.0.X - 7.2.X

     % sqldba lmode=y
     SQLDBA> connect internal
     SQLDBA> show sga

7.1.X - 7.3.X

     % svrmgrl
     SVRMGR> connect internal
     SVRMGR> show sga

다음은 결과의 예이다.

Total System Global Area       4504072 bytes <-- 메모리 상의 전체 크기
             Fixed Size         37704 bytes
          Variable Size       4048576 bytes
       Database Buffers        409600 bytes
           Redo Buffers          8192 bytes  ('log buffers')


Prev: Database 비교 ; Oralce RAC 에 대한 간단한 설명
Next: ORACLE 9I 인스턴스 구동을 위한 SPFILE 및 INIT.ORA 파라미터 파일
2006/05/25(16:34) from 203.234.120.78
CrazyWWWBoard 2000

Vote Reply Modify Delete Forward Prev Next List
(c) Nobreak Technologies, Inc.