by 구루비 SGA 공유 풀 SHARED POOL 버퍼캐쉬 BUFFER CACHE 리두로그 버퍼 REDO LOG BUFFER LARGE POOL JAVA POOL DB_CACHE_SIZE [2005.03.03]
- 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로 구성되어 있습니다.
Shared Pool은 Library Cache와 데이터 사전 캐쉬(Data Dictionary Cache)로 구성되어 있습니다.
Shared Pool은 하나의 데이타베이스에 행해지는 모든 SQL 문을 처리하기 위하여 사용 됩니다.
Shared Pool은 문장을 실행하기 위해 그 문장과 관련된 실행 계획과 구문분석 정보가 들어 있습니다.
Shared Pool의 사이즈는 SHARED_POOL_SIZE 파라미터 값으로 결정합니다.
라이브러리 캐쉬는 가장 최근에 사용된 SQL 문장의 명령문과, 구문 분석 트리, 실행계획 정보를 가지고 있습니다.
Shared SQL과 Shared PL/SQL 영역으로 구분되어 있습니다.
Shared SQL 영역 : SQL문장에 대한 실행계획과 파싱 트리를 저장하고 공유 합니다. 동일한 문장이 다음번에 실행되면 Shared SQL 영역에 저장되어 있는 실행계획과 파싱 트리를 그대로 이용하기 때문에 SQL 문장의 처리 속도는 향상 됩니다.
Shared PL/SQL 영역 : 가장 최근에 실행한 PL/SQL 문장을 저장하고 공유 합니다. 파싱 및 컴파일 된 프로그램 및 프로시져(함수, 패키지, 트리거)가 저장 됩니다.
테이블, 컬럼, 사용자 이름, 사용 권한 같은 가장 최근에 사용된 데이터 사전의 정보를 저장하고 있습니다
구문 분석 단계에서 서버 프로세스는 SQL문에 지정된 오브젝트 이름을 찾아내고 접근 권한을 검증하기 위해 Dictionary Cache의 정보를 찾아봅니다
데이터베이스 버퍼 캐쉬는 가장 최근에 사용된 데이타를 저장하는 메모리 공간 입니다.
이 버퍼는 아직까지 디스크에 완전히 쓰여지지 않는 수정된 데이타를 보유할 수도 있습니다.
LRU 알고리즘에 의하여 가장 오래전에 사용된 것은 디스크에 저장하고 메모리에는 가장 최근에 사용된 데이타를 저장 함으로, 디스크 입출력이 줄어 들고, 데이타베이스 시스템의 성능이 증가 됩니다.
LRU 알고리즘 : 최근에 사용된 블록을 유지하기 위해 오래된 것을 제거하는 알고리즘.
Oracle 8i까지는 DB_BLOCK_SIZE와 DB_BLOCK_BUFFERS를 곱해서 데이터베이스 버퍼 캐쉬의 크기를 결정 했습니다. 하지만 Oracle 9i부터는 DB_BLOCK_BUFFERS를 Deprecated 시키고, DB_CACHE_SIZE 라는 파라미터가 Oracle 9i에 새롭게 도입이 되었습니다. (DB_BLOCK_SIZE : 데이터베이스 버퍼 캐쉬 내의 블록의 크기)
위 세 가지 파라미터는 예전 버전과의 호환을 위해 존재하는 것으로, Oralce 9i부터는 의미가 없어 집니다.
Oracle 9i는 위의 파라미터들이 정의되어 있으면 위에 값들을 사용하게 됩니다.
하지만, Oracle 9i에 생성된 새로운 파라미터들을 사용하는 것이 좋으며, 만일 위 파라미터(DB_BLOCK_BUFFERS, BUFFER_POOL_KEEP, BUFFER_POOL_RECYCLE) 값들을 사용한다면 Oracle 9i의 새로운 기능인 Dynamic SGA 특징을 사용할 수 없습니다.
또한 initSID.ora 화일에 위 파라미터들과 새로운 파라미터를 동시에 기술한다면 에러가 발생합니다
다음의 세 가지 파라미터가 추가 되었습니다.
- 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;
리두 로그 버퍼는 데이터베이스에서 일어난 모든 변화를 저장하는 메모리 공간 입니다.
DB에서 발생한 모든 변화는 LGWR에 의해 리두 로그 파일에 저장 합니다.
리두 로그 버퍼는 Database의 변경 사항 정보를 유지하는 SGA에 있는 Circular(순환) 버퍼 입니다
Redo Log Buffer의 크기는 오라클 파라미터 LOG_BUFFER에서 지정합니다.
Java Pool은 자바로 작성된 프로그램을 실행할 때 실행 계획을 저장하는 영역 입니다.
Java Pool은 JAVA_POOL_SIZE 파라미터로 관리되며, 기본 크기 24MB가 할당 됩니다.
Large Pool은 Oracle 백업 및 복원 작업에 대한 대용량 메모리 할당, I/O 서버 프로세스 및 다중 스레드 서버와 Oracle XA에 대한 세션 메모리를 제공하는 SGA의 선택적인 영역입니다
Large Pool은 LARGE_POOL_SIZE 파라미터로 관리되며, 기본 크기는 0 bytes 입니다.
- 강좌 URL : http://www.gurubee.net/lecture/1854
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.