SGA(System Global Area)란?
Oracle Database에서 사용하는 공유 메모리 영역으로, 데이터베이스 인스턴스가 실행될 때 생성되며, 모든 서버 및 백그라운드 프로세스가 공동으로 사용하는 메모리 영역이다.
SGA는 데이터 캐싱, SQL 실행 정보 저장, 프로세스 간 통신 등을 담당하며, 성능 최적화를 위해 중요한 역할을 한다.
서버 프로세스와 백그라운드 프로세스가 공통으로 액세스하는 데이터와 제어 구조를 캐싱한다.
SGA의 주요 구성 요소
1. 공유 풀(Shared Pool)
- SQL 및 PL/SQL 실행을 위한 파싱 정보, 실행 계획, 데이터 딕셔너리 정보 등을 저장
주요 구성 요소
1) 라이브러리 캐시(Library Cache) : SQL, PL/SQL 코드, 실행 계획 등을 저장
2) 데이터 딕셔너리 캐시(Data Dictionary Cache) : 테이블, 인덱스, 사용자 정보 등을 저장
🔹 튜닝 포인트: SQL 재사용성을 높이기 위해 바인드 변수(Bind Variables)를 사용하는 것이 좋음
2. 데이터베이스 버퍼 캐시( Database Buffer Cache)
- 디스크에서 읽어온 블록을 메모리에 저장하여 성능을 향상
- 자주 사용하는 데이터를 메모리에 유지하여 디스크 I/O 최소화
- 데이터 수정시 더티 블록(Dirty Block)이 발생하며, 일정 시간 후 DBWR 프로세스에 의해 디스크로 기록됨
🔹 튜닝 포인트 : LRU(Least Recently Used) 알고리즘을 사용하여 가장 오랫동안 사용되지 않은 블록을 제거
3. 로그 버퍼(Log Buffer)
- 트랜잭션이 발생할 때 생성된 REDO 로그 정보를 저장
- 로그 버퍼의 데이터는 주기적으로 REDO 로그 파일로 기록됨
- 시스템 장애 발생 시 복구를 위한 핵심 역할
🔹 튜닝 포인트 : 로그 버퍼 크기를 적절하게 조절하여 불필요한 I/O를 줄이는 것이 중요
4. Java 풀(Java Pool)
- Java 기반 스토어드 프로시저, Java 클래스 등을 저장하는 공간
- Java VM이 실행되는 경우 필요
5. Large Pool
- 백업 및 복구(RMAN), 병렬 SQL 실행, 공유 서버 프로세스 등을 위한 메모리 공간
- 공유 풀과 다르게 LRU를 사용하지 않음
6. Streams Pool
- Oracle Stream를 사용할 때 데이터 변경 사항을 저장하는 메모리 영역
- Streams 기능을 사용하지 않으면 크기를 0으로 설정 가능
SGA 크기 관리 방법
SGA 크기는 자동(Automatic) 또는 수동(Manual)으로 관리할 수 있다.
1. 자동 메모리 관리(AMM, Automatic Memory Management)
- SGA 및 PGA를 포함한 전체 메모리를 자동으로 관리
- MEMORY_TARGET 및 MEMORY_MAX_TARGET 파라미터를 설정하여 사용
ALTER SYSTEM SET MEMORY_TARGET = 2G SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_MAX_TARGET = 4G SCOPE=SPFILE;
2. 자동 SGA 관리(ASMM, Automatic Shared Memory Management)
- SGA_TARGET을 설정하여 SGA 내부의 공유 풀, 버퍼 캐시, 로그 버퍼 등을 자동으로 조절
- 개별 크기를 직접 지정하지 않아도 되며, 필요에 따라 동적으로 조정됨
ALTER SYSTEM SET SGA_TARGET = 4G SCOPE=SPFILE;
ALTER SYSTEM SET SGA_MAX_SIZE = 6G SCOPE=SPFILE;
3. 수동 SGA 관리
- 개별적으로 메모리 크기를 직접 지정해야 함
- SHARED_POOL_SIZE, DB_CACHE_SIZE, LOG_BUFFER 등의 파라미터를 수동으로 조정
ALTER SYSTEM SET SHARED_POOL_SIZE = 1G SCOPE=SPFILE;
ALTER SYSTEM SET DB_CACHE_SIZE = 2G SCOPE=SPFILE;
SGA 확인 및 조정
1. 현재 SGA 크기 확인
SHOW PARAMETER SGA;
--또는
SELECT * FROM V$SGAINFO;
2. 각 영역별 크기 확인
SELECT NAME, BYTES FROM V$SGA;
3. SGA 조정
- SGA 크기를 동적으로 조정하려면 ALTER SYSTEM 명령어 사용
- SCOPE = SPFILE을 설정하면 다음 DB 재시작 시 반영됨
ALTER SYSTEM SET SGA_TARGET = 5G SCOPE=SPFILE;
4. SGA 튜닝 시 고려할 점
- SGA 크기가 너무 작으면 → 디스크 I/O 증가 (성능 저하)
- SGA 크기가 너무 크면 → OS 메모리 부족으로 스왑 발생
- 공유 풀(Shared Pool)을 적절히 조절하여 SQL 파싱 비용 최소화
- 데이터베이스 버퍼 캐시를 충분히 확보하여 캐싱 성능 극대화
- Redo 로그 버퍼 크기 조절로 트랜잭션 성능 최적화
다른 DBMS에서 SGA와 유사한 개념
DBMS | SGA와 유사한 개념 | 설명 |
Oracle | SGA (System Global Area) | 데이터 캐시, SQL 파싱, 트랜잭션 로그를 저장하는 공유 메모리 영역 |
MySQL (InnoDB 엔진 기준) | Buffer Pool | 디스크에서 읽어온 데이터를 저장하고 캐싱하는 역할 |
PostgreSQL | Shared Buffers | 디스크에서 읽어온 데이터를 메모리에 저장하여 빠르게 접근할 수 있도록 함 |
SQL Server | Buffer Pool & Plan Cache | 데이터 및 실행 계획을 캐싱하여 성능을 최적화 |
DB2 | Buffer Pool & Package Cache | 데이터 블록 및 실행 계획을 저장하는 메모리 영역 |
MariaDB | InnoDB Buffer Pool | MySQL과 동일한 InnoDB 엔진을 사용하여 데이터 캐싱 수행 |
각 DBMS별 메모리 방식 관리 방식 상세 비교
1. MySQL (InnoDB 엔진)
- Buffer Pool: 디스크에서 읽어온 데이터를 메모리에 저장 (SGA의 Database Buffer Cache 역할)
- Change Buffer: 변경된 데이터를 임시로 저장 (Redo Log 역할)
- Adaptive Hash Index: 자주 사용되는 데이터에 대한 해시 인덱스를 생성하여 빠르게 검색 가능
- MySQL Query Cache (deprecated): 실행된 쿼리 결과를 캐싱 (현재는 제거됨)
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
🔹 튜닝 포인트: innodb_buffer_pool_size 값을 적절하게 조정하면 성능이 향상됨
2. PostgreSQL
- Shared Buffers: 디스크에서 읽어온 데이터를 저장하여 빠르게 접근할 수 있도록 함 (SGA의 Database Buffer Cache 역할)
- WAL Buffer: 트랜잭션 로그를 저장 (SGA의 Log Buffer 역할)
- Work Memory: 쿼리 실행 중 정렬 및 해시 조인 등의 연산을 위한 메모리 공간
SHOW shared_buffers;
SHOW work_mem;
🔹 튜닝 포인트: shared_buffers 값을 RAM의 25~40% 수준으로 설정하는 것이 일반적
3. SQL Server
- Buffer Pool: 데이터 및 인덱스를 메모리에 저장 (SGA의 Database Buffer Cache 역할)
- Plan Cache: SQL 실행 계획을 저장 (SGA의 Shared Pool 역할)
- Log Buffer: 트랜잭션 로그를 저장하여 성능을 최적화 (SGA의 Log Buffer 역할)
SELECT * FROM sys.dm_os_memory_clerks;
🔹 튜닝 포인트: max server memory 설정을 통해 메모리 사용량을 조정할 수 있음
4. IBM Db2
- Buffer Pool: 데이터를 캐싱하여 성능을 향상 (SGA의 Database Buffer Cache 역할)
- Package Cache: 실행 계획을 저장하여 SQL 성능을 최적화 (SGA의 Shared Pool 역할)
- Lock List: 트랜잭션의 잠금 정보를 저장
SELECT * FROM syscat.bufferpools;
🔹 튜닝 포인트: BUFFERPOOL 설정을 적절히 조절하면 성능이 향상됨
'DataBase' 카테고리의 다른 글
[SQL] 논리적 I/O와 물리적 I/O의 유형 정리 (0) | 2025.03.08 |
---|---|
[SQL] 데이터베이스 저장 구조(Database Storage Structure) (1) | 2025.03.07 |
[SQL 튜닝/옵티마이저] 🎈오라클 힌트란? 간단한 사용 방법 (0) | 2024.07.08 |
엑셀을 이용한 쿼리문 작성 (0) | 2022.10.12 |
[Oracle] select문으로 insert하기(row_number() 이용) (0) | 2022.10.11 |