본문 바로가기

SQLP 자격증

SQLP - 데이터베이스 아키텍처(2)

@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