SGA 크기를 결정하는 방법

2010.05.12 08:29

조인상 조회 수:8993

원문 : http://www.ischo.net -- 조인상 // 시스템 엔지니어

Writer : http://www.ischo.net -- ischo // System Engineer in Replubic Of Korea

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

본문 : http://www.ischo.net -- 조인상 //시스템 엔지니어

+++++++++++++++++++++++++++++++++++++++++++++++++++++++


출처 : 다음카페



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 preformance
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배 이상의 크기가 지정 되어야 한다. 자세한 자료는
<Note 30753.1> Init.ora Parameter "LOG_BUFFER" Reference Note 참조

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')
번호 제목 글쓴이 날짜 조회 수
35 online backup(archive log mode) 조인상 2010.05.12 19463
34 패치 중 OS 문제로 runInstaller가 끊길때 조인상 2010.05.12 6456
33 OPATCH(V9.2) 기능 및 사용가이드 조인상 2010.05.12 6610
32 Opatch : 다재다능한 패치 관리 유틸리티 file 조인상 2010.05.12 10345
31 datafile 위치 변경하는 방법 조인상 2010.05.12 10119
30 오라클 startup & shutdown 쉘 스크립트 짜는 법 조인상 2010.05.12 11657
29 [oerr] ORA-19206: Invalid value for query or REF CURSOR parameter 조인상 2010.05.12 7502
» SGA 크기를 결정하는 방법 조인상 2010.05.12 8993
27 오라클 튜닝 - 옵티마이저 조인상 2010.05.12 7367
26 AIX5.2 + 9.2.0.1.0 install + 9.2.0.5.0 patch 조인상 2010.05.12 7317
25 Aix 5L에서 오라클9i 설치법 조인상 2010.05.12 9743
24 LOCK 문제 확인과 해결 방법 조인상 2010.05.12 15192
23 오라클 유저 생성 및 변경/삭제 조인상 2010.05.12 11442
22 [사이트 소개]오라클 사용자 그룹 조인상 2010.05.12 5752
21 테이블스페이스 사용현황 확인하는 스크립트 조인상 2010.05.12 7589
20 [기타] 디비튜닝에 대한 질문과답변내용... 조인상 2010.05.12 5751
19 캐릭터셋 변경방법 조인상 2010.05.12 7389
18 오라클 8.1.7 -> 7.3.4 로 DB data 이전 조인상 2010.05.12 6952
17 인텔 펜티엄4 기반 Windows에 설치시 오류에 대해서 조인상 2010.05.12 5831
16 오라클에 접속하는 최대 인스턴스개수(세션개수)를 늘리는 방법 조인상 2010.05.12 7177
서버에 요청 중입니다. 잠시만 기다려 주십시오...