Oracle Admin 강좌 (Oracle9i)
시스템 글로벌 영역(SGA) 51 13 61,033

by 김정식 SGA 공유 풀 SHARED POOL 버퍼캐쉬 BUFFER CACHE 리두로그 버퍼 REDO LOG BUFFER LARGE POOL JAVA POOL DB_CACHE_SIZE [2005.03.03]


SGA란?

  - SGA는 간단하게 오라클서버의 메모리영역이라고 할 수 있습니다.

  - SGA는 Oracle의 인스턴스에 대한 데이타와 제어 정보를 가지는 공유 메모리 영역의 집합 입니다.

  - 사용 목적의 따라 오라클 파라미터 파일(init.ora)의 조정으로 SGA의 각 부분의 크기를 조절 할 수 있습니다. (initSID.ora 파일을 열어보시면 large_pool_size=8388608, shared_pool_size=50331648 이렇게 사이즈가 지정되어 있습니다.)

  - Oracle9i부터 오라클 서버의 종료 없이 SGA의 구성을 SGA_MAX_SIZE 파라미터 값 범위 내에서만 각각의 크기를 동적으로 변경 가능 합니다.

  - Oracle 서버를 동시에 사용하고 있는 사용자는 시스템 글로벌 영역의 데이타를 공유 합니다.

  - 전체 SGA를 실제 메모리 크기가 허용하는 범위에서 가장 크게 잡으면 디스크 I/O를 줄이고 메모리에 가능한 많은 데이타를 저장할 수 있으므로 최적의 성능을 낼 수 있습니다.

  - SGA공유 풀(Shared Pool), 데이터베이스 버퍼캐쉬(DataBase Buffer Cache), 리두로그 버퍼(Redo Log Buffer) 이 세가지 와 LARGE POOL과 JAVA POOL로 구성되어 있습니다.

SGA

1. 공유 풀(Shared Pool)

  Shared Pool은 Library Cache데이터 사전 캐쉬(Data Dictionary Cache)로 구성되어 있습니다.

  Shared Pool은 하나의 데이타베이스에 행해지는 모든 SQL 문을 처리하기 위하여 사용 됩니다.

  Shared Pool은 문장을 실행하기 위해 그 문장과 관련된 실행 계획과 구문분석 정보가 들어 있습니다.

  Shared Pool의 사이즈는 SHARED_POOL_SIZE 파라미터 값으로 결정합니다.

① Library Cache

  라이브러리 캐쉬는 가장 최근에 사용된 SQL 문장의 명령문과, 구문 분석 트리, 실행계획 정보를 가지고 있습니다.

  Shared SQL과 Shared PL/SQL 영역으로 구분되어 있습니다.

  Shared SQL 영역 : SQL문장에 대한 실행계획과 파싱 트리를 저장하고 공유 합니다. 동일한 문장이 다음번에 실행되면 Shared SQL 영역에 저장되어 있는 실행계획과 파싱 트리를 그대로 이용하기 때문에 SQL 문장의 처리 속도는 향상 됩니다.

  Shared PL/SQL 영역 : 가장 최근에 실행한 PL/SQL 문장을 저장하고 공유 합니다. 파싱 및 컴파일 된 프로그램 및 프로시져(함수, 패키지, 트리거)가 저장 됩니다.

② Data Dictionary Cache

  테이블, 컬럼, 사용자 이름, 사용 권한 같은 가장 최근에 사용된 데이터 사전의 정보를 저장하고 있습니다

  구문 분석 단계에서 서버 프로세스는 SQL문에 지정된 오브젝트 이름을 찾아내고 접근 권한을 검증하기 위해 Dictionary Cache의 정보를 찾아봅니다

데이터베이스 버퍼 캐쉬(DataBase Buffer Cache)

  데이터베이스 버퍼 캐쉬는 가장 최근에 사용된 데이타를 저장하는 메모리 공간 입니다.

  이 버퍼는 아직까지 디스크에 완전히 쓰여지지 않는 수정된 데이타를 보유할 수도 있습니다.

  LRU 알고리즘에 의하여 가장 오래전에 사용된 것은 디스크에 저장하고 메모리에는 가장 최근에 사용된 데이타를 저장 함으로, 디스크 입출력이 줄어 들고, 데이타베이스 시스템의 성능이 증가 됩니다.

  LRU 알고리즘 : 최근에 사용된 블록을 유지하기 위해 오래된 것을 제거하는 알고리즘.

  Oracle 8i까지는 DB_BLOCK_SIZEDB_BLOCK_BUFFERS를 곱해서 데이터베이스 버퍼 캐쉬의 크기를 결정 했습니다. 하지만 Oracle 9i부터는 DB_BLOCK_BUFFERS를 Deprecated 시키고, DB_CACHE_SIZE 라는 파라미터가 Oracle 9i에 새롭게 도입이 되었습니다. (DB_BLOCK_SIZE : 데이터베이스 버퍼 캐쉬 내의 블록의 크기)

오라클 9i에 변경된 Database Buffer Cache 파라미터

① Deprecated Buffer Cache Parameters
  • - DB_BLOCK_BUFFERS
  • - BUFFER_POOL_KEEP
  • - BUFFER_POOL_RECYCLE

  위 세 가지 파라미터는 예전 버전과의 호환을 위해 존재하는 것으로, Oralce 9i부터는 의미가 없어 집니다.

  Oracle 9i는 위의 파라미터들이 정의되어 있으면 위에 값들을 사용하게 됩니다.

  하지만, Oracle 9i에 생성된 새로운 파라미터들을 사용하는 것이 좋으며, 만일 위 파라미터(DB_BLOCK_BUFFERS, BUFFER_POOL_KEEP, BUFFER_POOL_RECYCLE) 값들을 사용한다면 Oracle 9i의 새로운 기능인 Dynamic SGA 특징을 사용할 수 없습니다.

  또한 initSID.ora 화일에 위 파라미터들과 새로운 파라미터를 동시에 기술한다면 에러가 발생합니다

② New Buffer Cache Sizing Parameters

  다음의 세 가지 파라미터가 추가 되었습니다.

  - DB_CACHE_SIZE : 디폴트 버퍼 캐시, 반드시 존재해야 하며, 0으로 설정할 수 없습니다.

  - DB_KEEP_CACHE_SIZE : Keep Buffer Cache의 크기, 재활용될 가능성이 높은 블록을 고정적으로 저장하는데 사용 합니다.

  - DB_RECYCLE_CACHE_SIZE : 재활용 버퍼 캐시 크기, 재활용 될 가능성이 낮은 블록을 즉시 제거하는데 사용 합니다.

  이전 버전과 다른 점은 이전 버전의 경우 각각의 파라미터 (DB_BLOCK_BUFFERS, BUFFER_POOL_KEEP, BUFFER_POOL_RECYCLE)에 정의된 값들이 BUFFER 개 수(즉, 실제 메모리 크기를 구하려면 DB_BLOCK_SIZE를 곱했어야)였는데 반해 이제는 구체적인 메모리 크기를 지정 합니다.

  Oracle 9i부터는 Multiple Block Size(2K, 4K, 8K, 16K, 32K)를 지원 합니다.

  DB_BLOCK_SIZE에 의해 정해진 BLOCK SIZE가 기본 BLOCK SIZE가 됩니다. (SYSTEM TABLESPACE는 이 BLOCK SIZE를 이용합니다.)

  Oracle 9i에 새로 생긴 파라미터는 아래와 같이 ALTER SYSTEM 명령으로 동적변경이 가능합니다.

 
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;  
    

리두 로그 버퍼(Redo Log Buffer)

  리두 로그 버퍼는 데이터베이스에서 일어난 모든 변화를 저장하는 메모리 공간 입니다.

  DB에서 발생한 모든 변화는 LGWR에 의해 리두 로그 파일에 저장 합니다.

  리두 로그 버퍼는 Database의 변경 사항 정보를 유지하는 SGA에 있는 Circular(순환) 버퍼 입니다

  Redo Log Buffer의 크기는 오라클 파라미터 LOG_BUFFER에서 지정합니다.

Java Pool과 Large Pool

Java Pool

  Java Pool은 자바로 작성된 프로그램을 실행할 때 실행 계획을 저장하는 영역 입니다.

  Java Pool은 JAVA_POOL_SIZE 파라미터로 관리되며, 기본 크기 24MB가 할당 됩니다.

Large Pool

  Large Pool은 Oracle 백업 및 복원 작업에 대한 대용량 메모리 할당, I/O 서버 프로세스 및 다중 스레드 서버와 Oracle XA에 대한 세션 메모리를 제공하는 SGA의 선택적인 영역입니다

  Large Pool은 LARGE_POOL_SIZE 파라미터로 관리되며, 기본 크기는 0 bytes 입니다.

참고링크

- 강좌 URL : http://www.gurubee.net/lecture/1854

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 김정식 [2005.03.03 14:29:55]
SGA 구성영역 조회

C:\>sqlplus /nolog
SQL>conn sys/manager as sysdba
SQL>show sga;

Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 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배 이상으로 지정됨

by 김정식 [2005.03.03 14:31:03]
파라미터 동적 변경 예제..

SQL> alter system set large_pool_size=16M scope=both

alter system 명령 뒤에 scope에 대하여

- memory : 변경이 현재 상태에만 영향을 미치며, db가 restartup 되면, 변경 이전 값으로
돌아간다.

- spfile : 변경 내용을 spfile에만 저장하고 현재 상태에는 영향을 미치지 않게 한다.
static parameter의 경우는 이 scope만이 지정 가능하다.

즉, spfile을 사용하더라도 static parameter에 대해서는 db운영중에 바로 값을 변경하여
restartup없이 반영하는 것는 불가능하다.

- both : 변경 내용을 현재 상태에도 바로 반영하고, spfile에도 반영시켜, 이후 rebooting
시에도 영향을 미치도록 한다.

by 김정식 [2005.03.03 14:32:01]
오라클 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)

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에서는 값을 동적으로 바꿀 수 없으며, 후속 버젼에서 적용될 예정이다)

오라클 불틴 사이트 참고

by 공부중 [2005.04.22 18:14:55]
* oracle8i
Database Buffers size = db_block_buffers * block size

* oracle9i
Database Buffers size = db_cache_size

by 신철민 [2006.07.05 19:06:04]
10g에서는 자바 풀에 대해서는 value 0M로 디폴트로 지정되어 있던데요.
초보 오라클러 였습니다. 다른 것도 디폴트가 0오르 된것을 몇개 봤습니다.
확인 하세요..10g사용자 여러분^^;;

by 궁금이 [2011.04.18 08:46:55]
dedicate server가아니라shared server를사용하는경우PGA가하는일을SGA의Large Pool에서처리한다고하는데구체적으로어떤기능들을하나요~?혼자공부하려니막히는게많네요~ㅠㅠ

by Dreamer [2011.09.14 23:23:08]
감사합니다.

by 볼우물 [2011.09.29 17:11:49]
좋은 정보 감사합니다.

by 신종환 [2012.10.30 15:34:35]

항상 감사드립니다 ^^


by 쫑 [2013.01.29 11:17:02]
감사합니다~^^

by 손님 [2013.07.26 11:27:17]
감사합니다. 

by 안떠니 [2014.11.26 01:29:47]

 Java Pool은 자바로 작성된 프로그램을 실행할 때 실행 계획을 저장하는 영역 입니다.

// 오라클 내부에서 자바 프로그램을 실행할 수 있나요?

// 어떤 방법으로 자바 프로그램을 실행시키나요?

// 이해가 안가네요...이 문장이요..


by 아까걔 [2015.12.08 16:19:29]

굿

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입