개발노트

[Oracle] 메모리 구조 본문

Database/Oracle

[Oracle] 메모리 구조

개발자? 2022. 6. 26. 13:29

오라클 데이터베이스 서버의 중요한 세가지 구조

1. 메모리 구조

2. 프로세스 구조

3. 저장 영역 구조

 

메모리 구조


크게 SGA 와 PGA 로 구성되어 있다.

 

1. SGA 구성요소


Instance 에 대한 데이터 및 제어 정보를 포함하는 공유 메모리 영역이다.

사용자: 모든 서버 프로세스, 백그라운드 프로세스

다음 데이터 구조를 포함한다.(** 는 필수요소)

  • **Database buffer cache
    데이터베이스에서 검색된 데이터 블록을 캐시에 저장한다.
  • **Shared pool
    유저 간에 공유할 수 있는 다양한 구성요소를 캐시에 저장한다.
    • Library cache : 공유 SQL 영역, SQL Parsing 방법 결정시 참고하는 영역
    • Dictionary cache : SQL Excute(실행)시 사용하는 영역
    • 서버 결과 캐시 : SQL Query 결과와 PL/SQL 함수 결과를 데이터 블록이 아닌 결과 집합으로 저장한다.
    • 예약 Pool : 대용량의 연속 메모리 조각(chunk)을 할당할 때 사용
    • 기타
  • **Redo log buffer
    인스턴스 복구(Recovery) 에 사용되는 리두정보가 디스크에 저장된 물리적 Redo log file 에 기록될 때까지 해당 정보를 캐시에 저장한다.
  • **Fixed SGA 
    내부의 작업 관리 영역으로, 데이터베이스 및 인스턴스의 상태에 관한 일반적인 정보, 프로세스 간에 주고 받는 정보 등을 포함한다.
  • Large pool
    오라클 백업 및 복구 작업과 같은 특정 대용량 프로세스 및 I/O 서버 프로세스에 대한 대용량 메모리 할당을 제공하는 선택적 영역이다.
  • Java pool
    JVM(Java virtual machine) 내의 모든 세션별 Java 코드 및 데이터에 사용된다.
  • Streams pool
    Oracle Streams 에서 캡처 및 적용에 필요한 정보를 저장하는 데 사용된다.

 

아래는 SQL* Plus 에 접속해서 SGA 크기를 확인한 내용이다.

SGA 크기 확인

Total System Global Area : SGA 크기

Fixed Size : Fixed SGA 의 크기

Variable Size : Shared Pool + Java Pool + Large Pool

Database Buffers : 데이터베이스 버퍼 캐시 크기

Redo Buffers : 리두 로그 버퍼 크기

 

SGA 영역에서 할당된 크기 순서로 pool 확인해보면, Database buffer cache 와 Shared pool 이 전체여역의 94% 정도를 차지 하고 있다. 

SQL > select pool, round(sum(bytes)/1024/1024) as "size(mb)", sum(bytes) as "size(bytes)", round(sum(bytes)/all_size*100,2) as " (%)"
  from (
		select case when pool is null then name else pool end pool, bytes, sum(bytes) over(partition by 1) all_size
	     from v$sgastat
		)
group by pool, all_size
order by 2 desc

POOL                       size(mb)  size(bytes)  (%)     
-------------------------- --------- ----------- --------- 
buffer_cache                    1440   1.5099E+9     70.31
shared pool                      384   402653184     18.75
shared_io_pool                   112   117440512      5.47
large pool                        80    83886080      3.91
java pool                         16    16777216       .78
log_buffer                         8     8028160       .37
fixed_sga                          8     8748912       .41

7 row(s) fetched.
SQL executed time> 00:00:00.010

 

1.1 shared pool

SGA 영역의 일부로, 라이브러리 캐시, 데이터 딕셔너리 캐시, 서버 결과 캐시(SQL Query 결과, PL/SQL 함수 결과), 병렬 실행 메시지용 버퍼, 제어 구조가 포함된다.

 

데이터 딕셔너리

데이터베이스, 해당 구조 및 유저에 대한 참조 정보를 포함하는 데이터베이스 테이블 및 뷰 모음이다.

 

User Process 는 SQL 구문 분석을 위해 데이터 딕셔너리에 자주 액세스한다.

오라클 데이터베이스가 데이터 딕셔너리에 자주 액세스하기 때문에, 메모리에 있는 두 곳의 특수 위치가 딕셔너리 데이터를 보관하도록 지정된다. 그 중 한 영역은 데이터 딕셔너리 캐시, 다른 한 영역은 라이브러리 캐시이다.

 

데이터 딕셔너리 캐시는 전체 데이터 블록을 보관하는 버퍼가 아니라 행의 형태로 데이터를 보관한다. 그래서 행 캐시라고도 한다.

 

라이브러리 캐시는 데이터베이스에서 실행하는 모든 SQL 정보를 저장한다. SQL 구문 분석 트리와 실행 계획이 포함되어 있다. SQL 정보 재사용하여 메모리르 절약한다. 

 

1.2 데이터베이스 버퍼 캐시

SGA 영역의 일부로, 

데이터파일에서 읽은 블록 복사본과 읽기 일관성 모델을 만족시키기 위해 동적으로 생성된 블록 이미지(undo block)를 보관한다.

행 형식의 세그먼트이다.

모든 동시 유저가 공유한다.

버퍼 캐시 데이터는 디스크 액세스를 최소화하기 위해 최근에 사용된 블록이 메모리에 유지되도록 보장한다. 이는 LRU(Least Recently Used) List 와 접근횟수의 조합을 사용한 알고리즘에 의해 관리된다.

 

특정 데이터를 검색 과정

1. 데이터베이스 버퍼 캐시에서 데이터 검색

2-1. 데이터 발견하는 경우(캐시 적중) 메모리에서 데이터를 직접 읽어

→ 속도 빠름

2-2. 데이터 발견 못하는 경우(캐시 실패) 디스크의 데이터파일에서 검색한 후 발견한 데이터를 캐시의 버퍼로 복사
→ 속도 느림

 

버퍼 풀 튜닝

 

  • Keep Pool : 재사용률이 높은 오브젝트를 상주시켜 놓는 공간
  • Recycle Pool : 거의 사용 안함. 버퍼에 복사한 데이터를 빠르게 비우도록 설계된 공간, 현재는 거의 사용 안함
  • nK 버퍼 캐시 : 기본 블록(Default Data Block)과 다른 크기의 블록을 보관할 수 있는 공간
    따로 변경한 것이 아니라면 데이터 블록은 보통 8kb(8192 bytes) 이다. 

 

update 과정

update 대상 data block을 db buffer cache 에 복사하고, undo block 저장할 데이터 공간 할당

Redo log buffer 에 dml 내용 기록

db buffer cache에 할당해놓은 undo block 에 기존 데이터 기록

update 대상 data block 값 수정

 

rollback 과정

Redo log buffer 에 rollback 기록

undo block 데이터를 data block 에 다시 갱신

 

commit 과정

Redo log buffer에 commit 기록, 이때 트랜잭션의 시작지점도 같이 기록

Disk 에 있는 Redo log file 에 시작 트랜잭션부터 Commit 까지의 내용을 모두 기록(=> Disk I/O)

Redo log file 에 쓰기 작업이 완료되면 사용자에게 "Commit Complete" 로 commit 작업 완료 알림

 

 

1.3 Redo log buffer

SGA의 일부 영역으로, 데이터베이스에 대한 변경사항 정보들이 포함된 순환 버퍼이다.

Select 를 제외한 모든 명령어가 기록된다.

인스턴스 복구(Recovery)를 위해 필요한 공간이다.

서버 프로세스가 db 버퍼 캐시에 변경사항을 적용할 때(undo block, data block 갱신) 리두 항목이 생성되고, 리두 로그 버퍼에 기록된다. 

로그 기록자 백그라운드 프로세스는 리두 로그 버퍼를 디스크의 활성 리두 로그 파일(또는 파일 그룹)에 기록한다.

 

1.4 Large Pool

아래 작업들을 진행할 때 대용량 메모리(수백 kb) 할당을 제공하기 위한 선택적 메모리 영역으로, LRU List 로 관리되지 않음.

- Shared Server 및 Oracle XA 인터페이스용 세션 메모리(트랜잭션이 여러 데이터베이스와 상호 작용하는 경우)

- I/O 서버 프로세스

- 오라클 데이터베이스 백업 및 복원 작업

- Parallel Query(여러 프로세스의 작업을 조정하기 위한 공간)

- Advanced Queuing 

- Response/Request Queue

 

1.5 Java Pool 

JVM(Java Virtual Machine)의 모든 세션별 Java 코드와 데이터를 저장하는데 사용된다.

오라클 데이터베이스를 실행중인 모드에 따라 다른 방식으로 사용된다.

 

1.6 Streams Pool

Oracle Streams 작업을 위해 사용되는 공간이다.

버퍼링된 Queue 메시지를 저장하고, Oracle Streams 캡처 프로세스 및 적용 프로세스에 대한 메모리르 제공한다. 별도로 구성하지 않으면 Streams pool 의 크기는 0 에서 시작하며, Oracle Streams 가 사용될 때 필요에 따라 동적으로 커진다.

 

2. PGA


서버 또는 백그라운드 프로세스를 시작할 때 오라클 데이터베이스에서 생성되는 비공유 메모리이다.

서버 또는 백그라운드 프로세스의 데이터 및 제어정보를 포함한다.

서버 프로세스와 백그라운드 프로세스는 각각 자체적인 PGA를 갖습니다.

사용자: 서버 프로세스

다음 데이터 구조를 포함한다.(Dedicated Server 환경일 때)

  • Stack space
    • 바인드 변수
    • 로컬/Global 변수
    • 프로그램 단위(패키지, 프로시저, 함수, 익명블록, 트리거) 를 실행하는 세션 및 sql 실행을 위한 버퍼와 관련된 값
  • UGA(User global area)
    • Cursor State : 컴파일된 SQL 코드의 주소값 ( 세션 커서 캐싱을 위해 사용됨)
    • User Session Data
    • SQL 작업 영역
      . 정렬 영역 : order by , group by 수행 공간
      . 해시 영역 : 테이블 해시 조인을 수행하는 공간
      . 비트맵 생성 영역 : 비트맵 인덱스 생성에 사용되는 비트맵 생성하기 위한 공간
      . 비트맵 병합 영역 : 비트맵 인덱스 실행 계힉을 분석하기 위한 공간

Shared Server 환경에서는 여러 클라이언트 유저가 서버 프로세스를 공유한다. 이 모델에서 UGA 는 SGA(Shared Pool 또는 Large Pool)로 이동하여 PGA에는 Stack Space만 남는다.

 

 

반응형

'Database > Oracle' 카테고리의 다른 글

Oracle RAC  (0) 2022.07.19
Instance 구성  (0) 2022.07.19
Oracle 서버 기동 상태  (0) 2022.07.19
[Oracle] User 관리  (0) 2022.06.23
[Oracle] Tablespace  (0) 2022.06.22
Comments