오라클 메모리 구조 Memory Architecture
오라클 인스턴스가 시작되면 초기화 파라미터에 명시한대로 메모리영역을 할당하고 백그라운드 프로세스를 시작한다.
메모리영역에 저장되는 정보는 다음과 같다.
- 프로그램코드
- DB에 연결된 세션 정보 (inactive 포함)
- 프로그램 실행 중에 필요한 정보(예: 결과 rows 을 가져오는 쿼리의 현재 상태)
- 프로세스 간에 공유되는 lock 정보
- 캐싱된 data (data blocks, redo record)
1. 오라클 메모리 구조
1) SGA (System Global Area)
- Shared pool : SQL statements, data dictionary, Stored procedures 등을 캐싱하여 공유
- DB buffer cache : data block 을 disk I/O 를 통해 캐싱하여 공유.
- Redo log buffer : redo log file 을 캐싱하여 성능 향상
- Large pool : 아래 case 에서 shared pool 을 사용할수 있는데 large pool 을 사용하는 것을 고려해볼수 있다.
shared server (session memory)
Parallel query (message buffers)
Recovery Manager(I/O buffers )
- Java pool
2) PGA (Program Global Area)
: Server process 가 사용하는 메모리 영역 ( oracle 에서는 작업대 정도로 비유함)
각 server process 간에 각자의 PGA 를 사용하고 서로 공유되지 않음.
세션 A 가 쿼리를 날렸을때 중간계산된 값이 다른 세션에 의해 사용이 되면 안될것이다.
각 서버프로세스는 각자의 PGA 를 할당받는다고 했는데, 시스템 전체의 PGA를 total instance PGA 혹은 Instance PGA 라고 부름.
SGA 는 시스템 전체에서 하나이기에 (single node 기준) sga_max_size, sga_target 을 설정하지만
PGA 는 서버프로세스별 할당하므로 연관된 초기화 파라미터에 전체를 의미하는 aggregate 가 붙는다.(pga_aggregate_limit,pga_aggregate_target)
PGA 는 전체의 크기만 설정 가능하고 개별 세션의 PGA 를 조정하려면 아래와 같이 해야함.
alter session set workarea_size_policy = manual;
alter session set sort_area_size = 1024000;
하지만 오라클에서는 memory 관리를 수동으로 조정하는 것을 권장하지 않고 있다.
3) UGA (User Global Area)
The UGA is memory associated with a user session.
4) Software code areas
참조문서 https://docs.oracle.com/database/121/CNCPT/memory.htm#CNCPT007