Oracle SGA
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, STREAMS POOL, Fixed SGA로 구성되어 있습니다.
1. Database Buffer Cache
– 데이터 조회와 변경 등의 실제 작업이 일어나는 공간으로, 사용자가 조회 하거나 변경하려는 모든 데이터는 이 곳에 있어야 합니다.
– 여러 사용자가 공동으로 사용하는 곳으로 하나의 블록에 여러 사용자가 동시에 I/O를 시도 할수 있기 때문에, 어떤 사용자의 데이터를 다른 사용자가 훼손하는 등의 문제가 발생 할 수 있습니다. 따라서 Database Buffer Cache Block 상태를 3가지로 나누어 두고 리스트를 통해 관리하고 있습니다.
-
- Pinned Buffer : 다른 사용자가 사용하고 있는 블록.
- Dirty Buffer : 현재 작업은 진행되지 않지만 다른 사용자가 내용을 변경한 후 아직 데이터 파일에 저장 하지 않은 버퍼. 다른 사용자는 사용 할 수 없다.
- Free Buffer : 사용 되지 않았거나, Dirty Buffer 였다가 디스크로 저장되어 재사용 할 수 있는 블록.
– Buffer Block들의 상태를 관리 하기위해 LRU (Least recently Used) List 를 만들어 사용합니다. 가장 사용이 안되거나 이미 작업이 완료 되어서 덮어 써도 되는 블록을 찾아서 그 곳을 덮어쓰게 됩니다.
– Oracle은 LRU List를 스캔의 효율성을 위해 LRU 리스트와 LRUW 리스트로 나누고, 또 각각 세부적으로 메인 리스트와 보조 리스트로 별로 나누어서 관리합니다.
▶ LRU List
– 메인리스트 : 사용된 Buffer들의 리스트, Hot 영역과 Cold 영역으로 나눈다.
– 보조리스트 : 미 사용된 Buffer들이나 , DBWR에 의해 기록된 Buffer들의 리스트 (Free list)
▶ LRUW List
– 메인리스트 : 변경된 Buffer들의 리스트 (Dirty list)
– 보조리스트 : 현재 DBWR에 의해 기록중인 Buffer 들의 리스트
Oracle은 일반적으로 대용량인 DB Buffer Cache를 빠르게 관리하기 위해서 여러개의 구역으로 나누고 각 구역을 관리하는 Working Data Set을 여러개 생성해서 사용자들이 Free Buffer를 빠르게 찾을 수 있도록 만들어져 있습니다. 그러나 동시 접속 사용자가 많아지면 대기 현상 때문에 작업 속도가 느려지는 문제가 발생합니다. 이렇게 유한한 자원을 여러 Process가 한꺼번에 사용하려고 할 경우 순서를 지키는 것이 중요한데, 이런 경우 순서를 관리하기 위해 Oracle은 Latch라는 것을 사용합니다.
Latch 란 모든 메모리 자원의 사용 순서를 정해주는 역할을 합니다.
2. Redo Log buffer
– 데이터에 변경사항이 생길 경우 (DDL이나 DML이 실행 된 경우) 해당 변경 내용을 기록해 두는 역할을 합니다.
– 변경된 내용을 기록하는 메모리 공간을 Redo log buffer 라고 하고, Redo log buffer의 내용을 디스크에서 저장해 주는 파일을 Redo log file 이라고 부릅니다.
– 모든 변경사항이 전부 Redo에 기록 되는 것은 아닙니다. Direct load (SQL Loader, insert /*+ APPEND */) 나 table이나 index 생성시 nologging 옵션을 주면 기록을 하지 않습니다. (nologging 옵션이 있더라도 insert, update, delete는 모두 redo log에 기록됩니다.)
3. Shared Pool
– Shared Pool 은 Library Cache 와 Data Dictionary Cache (Row Cache)등의 공간으로 나뉘어 집니다. (11g 부터는 Server Result Cache 라는 부분도 추가)
– Library Cache는 Soft Parse 할 때 사용 되는 공간으로 이미 수행 되었던 SQL문장이나 PL/SQL 문장의 Parse Code와 해당 PL/SQL 문장, 실행 계획 등이 저장되어 있고, LRU 알고리즘으로 관리됩니다.
– Dictionary Cache는 구문분석이나 옵티마이저가 실행계획을 세울 때 사용 되는 주요 Dictionary들이 Row 단위로 Cache 되어 있습니다. LRU 알고리즘으로 관리됩니다.
※ 11g의 Server Result Cache
-
- 결과 값을 Cache 해두는 공간. 결과값을 Shared Pool에 저장해두었다가 동일한 Select 가 수행 되었을 경우 DB Buffer Cache 까지 가지 않고, 즉시 Server Reslut Cache 에서 가져가도록 해서 속도를 높이는 역할을 합니다.
- 이 기능은 기본적으로 사용 안 함으로 되어 있으며, SQL문장에 /*+ result_cache */ 힌트를 사용하여 수동으로 사용하도록 설정되어 있습니다.
- 파라메터 값의 RESULT_CACHE_MODE를 FORCE로 설정해 두면, 자동으로 Result Cache를 사용합니다.
- 이론상으로는 성능 개선 효과가 있어야 하나 눈에 띄게 성능이 좋아지지 않습니다.
4. Large Pool
– Shared server mode로 Oracle을 운영 할 경우 UGA가 이 곳에 생성됩니다.
– Parallel Excution (병렬처리) 작업을 할 경우 각 Process들간의 Message Buffer 가 이 곳에 생성됩니다.
– RMAN으로 백업이나 복구를 할 경우 RMAN이 사용하는 I/O용 Buffer가 이 곳에 생성됩니다.
5. Java Pool
– Java관련 code나 Java Virtual Machine(JVM) 관련 데이터를 저장합니다.
6. Streams Pool
7. Fixed SGA
– Oracle이 내부적으로 사용하기 위해 생성하는 공간입니다.
– 백그라운드 프로세스들이 필요로 하는 데이터베이스의 전반적인 공유 정보를 가지고 있습니다.
– 각 프로세스들끼리 공유해야만 하는 Lock 정보 저장하고 있습니다.
Dynamic SGA
Oracle 8i 까지는 SGA값을 설정 해주고 DB를 재구동 해주지 않으면 적용 되지 않았으나, 9i 부터는 alter system set 명령을 통해 DB에 즉시 적용이 가능합니다.
동적으로 크기를 바꿀 때 사용하기 위해 Oracle에서는 메모리를 할당하는 새로운 단위를 만들었는데 그래뉼(Granule) 이라고 합니다.
SGA_MAX_SIZE라는 파라메터 값에 따라 결정 되는데 9i 경우 SGA_MAX_SIZE가 128MB 이하이면 1Granule = 4M 이고 128MB보다 초과되면 1Granule = 16MB로 설정됩니다.
10g 이후 버전에서는 SGA_MAX_SIZE의 기준점이 1GB로 상향 조정 되었습니다. 즉 1GB 이하 이면 1Granule = 4M, 이상이면 1Granule = 16M 입니다. 그래뉼 값에 의해 shared pool size 를 10m를 주어도 4MB의 배수인 12MB를 할당하게 됩니다.
10g 이후부터는 ASMM 이라는 기능이 추가 되었는데 설정값은 0으로 해놓으면 Oracle이 알아서 필요한 만큼 최적의 값을 자동으로 할당합니다.
최신 댓글