오라클 관계형 데이터베이스의 구조 (1)



오라클DBMS의 구조.



인스턴스(Instance),메모리 부분에 생성되는 구조, 
데이터파일(Datafiles),데이터가 저장되는 부분 ,
컨트롤파일 (Controlfiles), DB전체의 관리정보가 들어있다.  
리두 로그파일 (Redo log files),장애 복구시 이용되는로그를 합쳐서 
데이터베이스(Database) 라고 지칭.

메모리에 생성되는 인스턴스는 두가지이다.
SGA (System Global Area)  인스턴스이고 
백그라운드 프로세스 (Background Processes) 나누어짐.




Part 1) SGA
인스턴스에 대한 데이터와 제어 정보를 가지는 공유 메모리 영역의 집합이다.
서버를 이용하는 사용자는 시스템 글로벌 영역의 데이터를 공유한다.
실제 메모리 크기가 허용하는 범위에서 크게 잡으면 디스크 I/O를 줄이고 메모리에 가능한 많은 데이터를 저장할 수 있으므로 최적의 성능을 낼 수 있다.

Database Buffer Cache는 데이터 조회와 변경 등의 실제 작업이 일어나는 공간으로 사용자가 조회 하거나 변경하려는 모든 데이터는 이 곳에 있다. 여러 사용자가 공동으로 사용하는 곳이라서 하나의 블록에 여러 사용자가 동시에 I/O를 할 가능성이 있어서, 문제가 발생할 요지가 높다. 그래서 블럭 상태를 3가지로 나누어 리스트를 통해 관리한다

1)Pinned Buffer: 다른 사용자가 사용하고 있는 블록.
2)Dirty Buffer: 현재 작업은 진행되지 않지만 다른 사용자가 내용을 변경한 후 아직 데이터 파일에 저장 하지 않은 버퍼. 다른 사용자는 사용 할 수 없다.
3)Free Buffer: 사용되지 않거나, Dirty Buffer였다가 디스크로 저장되어 재사용 할 수 있는 블록.

Oracle은 LRU List(Least recently Used)를 만들어 블록을 관리한다.
관리용이를 위해 가장 빈도수가 낮은 블럭을 사용하거나 이미 작업이 완료되어서 덮어 써도 되는 블록을 찾아서 그곳을 덮어쓰게 된다.
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가 사용할려고 하는 경우엔 순서를 지키는 것이 중요한데, 이런 경우 순서를 관리하기 위해 Latch를 사용한다.모든 메모리의 자원의 순서를 정해주는 역할이다.

Redo Log buffer
-데이터에 변경사항이 생길경우 해당 변경내용을 기록해두는 역할이다.  내용 기록은 log이고 저장해 주는 파일은 file이라고 부른다.모든 변경사항이 전부 기록 되는 것은 아니다.
SQL Loader과 insert나 table이나 index생성시 nologging 옵션을 준다면 기록되지 않는다.
(nologging 옵션이 있더라도 insert, update, delete는 모두 redo에 기록된다)

Shared Pool
-Library Cache와 Data Dictionary Cache등의 공간으로 나뉘어 진다. (11g에서는 Server Result Cache가 추가 됨). Library Cache는 이미 수행 되었던 SQL문장이나 PL/SQL문장의 Parse Code와 해당 PL/SQL문장, 실행 계획 등이 저장되어 있고, LRU 알고리즘으로 관리되어 진다.
Dictionary Cache는 구문분석할 때 Row단위로 Cache되어 있다.


※ 11g의 Server Result Cache
 - 결과값을 Cache 해두는 공간. 결과값을 Shared Pool에 저장해두었다가 동일한 Select 가 수행 되었을 경우 DB Buffer Cache 까지 가지 않고, 즉시 Server Reslut Cache 에서 가져가도록 해서 속도를 높이는 것.
 - 이 기능은 기본적으로 사용 안 함으로 되어 있으며, SQL문장에 /*+ result_cache */ 힌트를 사용하여 수동으로 사용하도록 설정.
 - 파라메터 값의 RESULT_CACHE_MODE를 FORCE로 설정해 두면, 자동으로 Result Cache를 사용.
 - 이론상으로는 성능 개선 효과가 있어야 하나 눈에 띄게 성능이 좋아지지 않는다고 한다.

Large Pool
-Shared server mode로 oracle을 운영할 경우 UGA가 이 곳에 생성된다.
병렬처리 작업할 경우 각 Process들간의 Message Buffer가 이 곳에 생성된다.
RMAN으로 백업이나 복구를 할 경우 RMAN이 상요하는 I/O용 Buffer가 이 곳에 생성된다.

Java Pool
-Java관련 코드나 jvm관련 데이터를 저장

Firxed SGA
-Oracle이 내부적으로 사용하기 위해 생성하는 공간.백그라운드 프로세스 들이 필요한 데이터베이스의 전반적인 공유 정보. 공유해야만 하는 Lock정보 저장.



Part 2) PGA(Program Global Area)    .  . .다음 장에 이어서 
각 프로세스당 하나씩 할당되어 개별적으로 사용되는 일종의 개인작업공간 영역이다

http://wiki.gurubee.net/pages/viewpage.action?pageId=26744202
구루비에 다른 좋은글이 있으므로 참고하자.

0 comments:

Post a Comment