@markdown
# Oracle 아키텍처(2)
_____
## 메모리구조
### 시스템 공유 메모리 여역
- Oracle : System Global Area(SGA)
- SQL Server : Memory Pool
- 여러 프로세스가 동시에 엑세스 할 수 있는 메모리영역
- 모든 DBMS는 공통적으로 사용하는 캐시 영역이 있음(DB버퍼캐시, 공유 Pool, 로그버퍼)
- 그 외에 Large Pool, Java Pool 시스템 구조와 제어 구조를 캐싱하는 영역을 포함한다.
- 여러 프로세스가 공유되기 때문에 내부적으로 Latch, 버퍼Lock, 라이브러리 캐시 Lock/Pin 같은 액세스 직렬화 매커니즘을 사용
### 프로세스 전용 메모리영역
- 오라클은 프로세스 기반의 아키텍처로 서버 프로세스가 자신만의 전용 메모리 영역을 가진다.(PGA : Process Global Area)
- 데이터를 정렬하고 세션과 커서 정보를 저장
- Thread 기반의 아키텍처를 사용하는 SQL Server는 PGA을 갖지 않는다.
### DB 버퍼캐시
- 데이터 파일로부터 읽어들인 데이터 블록을 담는 캐시영역
- 사용자 프로세스는 서버 프로세스를 통해 DB 버퍼 캐시의 버퍼 블록을 동시에 엑세스(내부적으로 Buffer Lock을 통한 직렬화)
- Direct Path Read 매커니즘이 작동하는 경우를 제외하면, 모든 블록 읽기는 버퍼 캐시를 통해 이루어짐
- 디스크에서 읽을 때도 버퍼캐시에 적재한 후 읽음
- 변경된 블록은 주기적으로 DBWR 프로세스에 의해 데이터 파일에 기록
- 디스크 I/O에 비해 메모리 I/O는 전기적 신호이기 때문에 비교할 수 없을 정도로 빠름
#### 버퍼 블록 상태
- Free Buffer - 아직 데이터가 읽혀지지 않아 비어 있는 상태이거나, 언제든지 덮어써도 되는 상태
- Dirty Buffer - 디스크에 기록되지 않아 데이터 파일 블록과 동기화가 필요한 버퍼 블록
- Pinned Buffer - 읽기 또는 쓰기 작업이 현재 진행중인 버퍼 블록
#### LRU 알고리즘
- 버퍼 캐시는 유한한 자원이므로 모든 데이터를 캐싱해 둘 수 없기 때문에 사용 빈도가 높은 데이터 블록 위주로 버퍼 캐시가 구성되도록 LRU 알고리즘 사용함
- 모든 버퍼 블록헤더를 LRU 체인에 연결해 사용 빈도 순으로 위치를 옮기다가 Free 버퍼가 필요해지면, 엑세스 빈도가 낮은 쪽 데이터 블록부터 밀어내는 방식
![](http://wiki.gurubee.net/download/attachments/26744202/lru.jpg)
### 공유 풀(Shared Pool)
- 딕셔너리 캐시와 라이브러리 캐시로 구성
#### 딕셔너리 캐시
- 테이블, 인덱스 같은 오브젝트, 테이블 스페이스, 데이터 파일, 세그먼트, 익스텐트, 사용자, 제약사항과 같은 메타정보 저장
#### 라이브러리 캐시
- SQL 실행에 관련된 모든 객체에 대한 정보 관리
- 서버 프로세스가 SQL을 작업할 때 사용되는 작업 공간
- SQL에 대해 분석정보 및 실행계획 저장
- 공유 SQL을 저장하기 위해 사용
- <b>라이브러리 캐시는 캐싱된 SQL과 실행계획의 재사용성을 높이는 것이 수행 성능을 높이고 DBMS 부하를 최소화 하는 것이 핵심</b>
### 로그버퍼
- 오직 Recovery를 위해 사용됨
- DB버퍼에 가해지는 모든 변경사항을 로그버퍼에 먼저 기록
### PGA(Process Global Area)
- Oracle 서버 프로세스는 자신만의 PGA 메모리 영역을 할당받아 프로세스에 종속적인 고유 데이터를 저장하는 용도로 사용
- PGA는 다른 프로세스와 공유되지 않은 독립적인 메모리 공간으로 똑같은 개수의 블록을 읽더라도 SGA 버퍼 캐시에서 읽는 것보다 보다 훨씬 빠름
#### UGA(User Global Area)
- 각 세션을 위한 독립적인 공간
- Dedicated Server - PGA에 UGA 영역 할당
- Shared Server - SGA의 Large Pool 또는 Shared Pool에 UGA 영역 할당
#### CGA(Call Global Area)
- 오라클은 하나의 데이터베이스 call을 넘어서 다음 call까지 계속 참조되는 정보를 UGA에 담고, call이 진행되는 동안 필요한 데이터는 CGA에 담는다.
- Parse Call, Execute Call, Fetch Call 마다 매번 할당 받음
- Call이 진행되는 동안 Recursive Call이 발생하면 그 안에서도 Parse, Execute, Fetch 단계별로 CGA 할당
- 할당된 공간은 Call이 끝나자마자 해제되어 PGA에 반환
#### Sort Area
- 데이터 정렬을 위해 사용되며, 부족할때마다 Chunk 단위로 조금씩 할당됨
- 세션마다 sort_area_size 파라미터로 설정 가능
- 9i 이상부터는 workarea_size_policy 파라미터를 auto로 설정하면 내부적으로 알아서 sort area를 할당해줌
<br>
## 대기이벤트
____
- DBMS 내부에서 활동하는 수많은 프로세스간에 상호작용이 필요하며, 그 과정에서 다른 프로세스가 일을 마칠때까지 기다려야하는 상황이 발생
- ex) 프로세스는 자신이 일을 계속 진행할 수 있는 조건이 충족될 때까지 Sleep 상태로 대기
### 라이브러리 캐시 부하
- 라이브러리 캐시에서 SQL 커서를 찾고 최적화 하는 과정에서 경합이 발생하여 나타난 대기이벤트
- 라이브러리 캐시와 관련해서 자주 발생하는 대기이벤트로 SQL이 참조하는 오브젝트에 다른 사용자가 DDL 문장을 수행할 때
- library cache lock
- library cache pin
- 데이터베이스 call과 네트워크 부하
- 애플리케이션과 네트워크 구간에서 소모된 시간에 의해 나타난 이벤트
- `SQL*Net message from client` : client로부터 다음 명령이 올때까지 idle 상태로 기다릴때 발생(데이터베이스 경합과 관계없음)
- `SQL*Net message to client` : 메시지를 보냈는데 메시지를 받았다는 신호가 늦게 도착하는경우 이거나 , 클라언트가 너무 바쁠경우
- `SQL*Net more data to client` : 메시지를 보냈는데 메시지를 받았다는 신호가 늦게 도착하는경우 이거나 , 클라언트가 너무 바쁠경우
- `SQL*Net more data from client` : 클라이언트로부터 더 받을 데이터가 있는데 지연이 발생한 경우
### 디스크 부하
- 디스크 I/O 발생할 때 나타나는 대기 이벤트
- `db file sequential read` : Single Block I/O. 한번의 I/O call에 하나의 데이터 블록만 읽음. 인덱스 블록을 읽을때 발생
- `db file scattered read` : Multi Block I/O . Table Full Scan 또는 Index Fast Full Scan 시 나타남
- `direct path read`
- `direct path write`
- `direct path write temp`
- `direct path read temp`
- `db file parallel read`
### 버퍼캐시 경합
- 버퍼캐시에서 블록을 읽는 과정에서 경합이 발생하여 나타나는 대기 이벤트
- latch : cache buffers chains
- latch : cache buffers lru chain
- buffers busy waits
- free buffer waits
### Lock 관련 대기이벤트
- Lock과 관련된 대기이벤트
- enq : TM - contention
- enq : TX - row lock contention
- enq : TX - index contention
- enq : TX - allocate ITL entry
- enq : TX contention
- latch free : 특정 자원에 대한 래치를 여러차례(2000번 가량) 요구했지만 해당 자원이 계속 사용중이어서 잠시 대기 상태로 빠질때마다 발생
- Lock은 사용자 데이터를 보호하는 반면, Latch는 SGA에 공유되어 있는 갖가지 자료구조를 보호할 목적으로 사용하는 가벼운 LOCK
- Latch도 일종의 Lock 이지만 큐잉(Queueing) 매커니즘을 사용하지 않음
- 특정자원에 액세스하려는 프로세스는 래치 획득에 성공할때까지 반복해서 시도하나, 우선권은 부여받지 못함(처음 시도한 래치가 맨 나중에 래치획득에 성공할수도 있음)
### 그 외 대기이벤트
- `log file sync`
- `checkpoint completed`
- `log file switch completion`
- `log buffer space`
> SQL 전문가 가이드 : 과목3. SQL 고급 활용 및 튜닝, 1장 SQL 아키텍처 기반 튜닝 원리 - 제1절 데이터베이스 아키텍처(p.481 ~ p.495)
> 사진 출처 : 구루비넷
'SQLP 자격증' 카테고리의 다른 글
SQLP - 데이터베이스 Call과 네트워크 부하 (0) | 2018.03.11 |
---|---|
SQLP - SQL 파싱 부하 (0) | 2018.03.05 |
SQLP - 데이터베이스 아키텍처(1) (0) | 2018.02.07 |
SQLP - 조인 수행 원리 (0) | 2018.02.06 |
SQLP - 인덱스 기본 원리 (0) | 2018.01.21 |