Oracle

Oracle: 메모리 구조

dewstream 2025. 8. 16. 08:00
728x90

※ Oracle: Memory Structure.

 

안녕하세요. 듀스트림입니다.

 

요즘 너무 바쁜 날들을 보내고 있어서 블로그 포스팅을 잘 못하고 있습니다.

 

오늘 포스팅은 오라클의 메모리 구조에 대한 내용입니다.


※ 그림은 공식 문서에 너무 잘 나와있어서 아래 링크 참고 부탁드립니다.

 

 

Database Concepts

This chapter discusses the memory architecture of a database instance.

docs.oracle.com


1. SGA (System Global Area)

  • 공유 메모리 영역으로 데이터베이스 인스턴스의 모든 서버 및 백그라운드 프로세스가 공유합니다.
  • 주요 구성 요소:
    • Database Buffer Cache: 디스크에서 읽은 데이터 블록을 임시 저장해 I/O를 줄입니다.
    • Redo Log Buffer: 트랜잭션 변경 내역을 저장해 복구 시 사용합니다.
    • Shared Pool: SQL 문, 실행 계획 등 재사용 가능한 정보를 캐시합니다.
    • Large Pool, Java Pool, Fixed SGA, In-Memory Area, Memoptimize Pool 등도 포함됩니다.
• In-Memory Area (IM column store)
 - 컬럼 방식으로 데이터를 메모리에 저장해 분석 쿼리를 매우 빠르게 처리할 수 있는 옵션 영역입니다.
 - IMCU, SMU, IMEU 등의 단위로 구성되고, 메모리 크기는 INMEMORY_SIZE 파라미터로 설정합니다.
 - 12.2 버전부터는 ALTER SYSTEM으로 동적으로 크기를 늘릴 수 있으며,
 - Oracle 23에서는 IM expression 지원, 자동 관리(INMEMORY_AUTOMATIC_LEVEL) 등의 기능도 강화되었습니다.

2. PGA (Program Global Area)

  • 각 서버 프로세스 혹은 백그라운드 프로세스마다 할당되는 고유 메모리입니다.
  • 공유되지 않으며, 정렬, SQL 변수 등을 위한 공간으로 사용됩니다.
  • 전체 인스턴스 PGA 크기는 초기화 파라미터로 조정 가능하며, 인스턴스 내 모든 PGA의 합으로 결정됩니다.

3. UGA (User Global Area)

  • 사용자 세션당 할당되는 메모리로, 로그인 정보나 PL/SQL 패키지 상태 같은 세션 관련 데이터를 저장합니다.
  • 전용 서버(dedicated server) 환경에서는 PGA에 포함되고, 공유 서버(shared server) 환경에서는 SGA에 저장됩니다.

4. Software Code Areas

  • Oracle 데이터베이스 코드(실행될 수 있는 명령 코드 등)를 저장하는 메모리 영역입니다.
  • 일반 사용자 프로그램의 메모리와 분리된 안전한 공간에 존재합니다.

5. MGA (Managed Global Area)

  • Oracle 프로세스 간 메모리 공유 및 조정을 위한 반공유 영역 (semi‑shared) 입니다.
  • 유연하게 구성·조정 가능하며, 필요한 프로세스가 동적으로 연결하여 사용할 수 있습니다.

6. 메모리 관리 방법

Oracle은 메모리 관리를 위한 다양한 방식을 제공합니다.

  • Unified Memory Management (MEMORY_SIZE 사용):
    • SGA, PGA, MGA, UGA 등을 하나의 총 메모리 풀로 보고 Oracle이 자동으로 분배합니다.
  • Automatic Memory Management (MEMORY_TARGET 사용):
    • SGA와 PGA 간 메모리를 자동으로 조절하며 최적화를 지원합니다 
  • Automatic Shared Memory Management:
    • SGA만 자동으로 관리하며, PGA는 개별 조정할 수 있는 옵션도 있습니다.
  • Manual Memory Management:
    • DBA가 각 구성 요소(SGA, PGA 등)의 크기를 직접 설정하는 방식입니다.

7. 뷰 쿼리

오라클이 확실히 좋아요. PG는 이런 뷰가 없습니다.

 

▸ 전체 메모리 개요

-- SGA 요약 (고정/가변/버퍼/리두 버퍼 등)
SELECT name, value
FROM v$sga;

-- SGA 상세 항목별 크기(그라뉼, Free 메모리 포함)
SELECT name, bytes, resizeable
FROM v$sgainfo
ORDER BY bytes DESC;

-- PGA 인스턴스 집계 통계
SELECT name, value, unit
FROM v$pgastat
ORDER BY name;

 

▸ SGA 상세 사용량 Top-N

-- SGA 컴포넌트별 사용량 Top 10
SELECT pool, name, bytes
FROM v$sgastat
ORDER BY bytes DESC
FETCH FIRST 10 ROWS ONLY;

 

▸ 버퍼 캐시 & 공유 풀 튜닝 지표

캐스 크기 조정 시 물리 I/O 예측, 파 시간 추정
-- DB 버퍼 캐시 크기: 물리읽기 예측(기본 풀만 보기)
SELECT size_for_estimate/1024/1024 AS mb,
       buffers_for_estimate,
       estd_physical_read_factor,
       estd_physical_reads
FROM v$db_cache_advice
WHERE name = 'DEFAULT'
ORDER BY size_for_estimate;

-- 공유 풀 크기별 예상 파싱 시간
SELECT shared_pool_size_for_estimate/1024/1024 AS mb,
       estd_lc_time_saved,
       estd_lc_time_saved_factor
FROM v$shared_pool_advice
ORDER BY shared_pool_size_for_estimate;
  • MB: 공유 풀 크기
  • estd_lc_time_saved: 파싱 시간을 얼마나 절약할 수 있는지(초)
  • estd_lc_time_saved_factor: 현재 대비 절약 비율

 

▸ PGA 상세

PGA 전체와 프로세스/세션별 사용량 드릴다운
-- (인스턴스) PGA 집계 현황
SELECT name, value, unit
FROM v$pgastat;

-- (프로세스) PGA 상위 사용 프로세스 10개
SELECT program,
       pga_used_mem/1024/1024  AS used_mb,
       pga_alloc_mem/1024/1024 AS alloc_mb,
       pga_max_mem/1024/1024   AS max_mb
FROM v$process
ORDER BY pga_used_mem DESC
FETCH FIRST 10 ROWS ONLY;

-- (세션) 세션별 PGA/UGA (통계 이름 기반 조인)
SELECT s.sid, s.username,
       SUM(CASE WHEN n.name='session pga memory' THEN ss.value END)/1024/1024 AS session_pga_mb,
       SUM(CASE WHEN n.name='session pga memory max' THEN ss.value END)/1024/1024 AS session_pga_max_mb,
       SUM(CASE WHEN n.name='session uga memory' THEN ss.value END)/1024/1024 AS session_uga_mb,
       SUM(CASE WHEN n.name='session uga memory max' THEN ss.value END)/1024/1024 AS session_uga_max_mb
FROM v$session s
JOIN v$sesstat ss ON ss.sid = s.sid
JOIN v$statname n ON n.statistic# = ss.statistic#
WHERE s.username IS NOT NULL
AND n.name IN ('session pga memory','session pga memory max','session uga memory','session uga memory max')
GROUP BY s.sid, s.username
ORDER BY session_pga_mb DESC;

 

▸ 동적 메모리 컴포넌트 & 리사이즈 추적

-- 현재 동적 SGA 컴포넌트 크기(자동 관리 시 유용)
SELECT component, current_size, min_size, max_size
FROM v$memory_dynamic_components
ORDER BY component;

 

▸ PGA 타깃 조정 시 캐시 히트 /초과 할당 예측

-- PGA 타깃 크기 조정 시 Hit%/Over-Allocation 예측 히스토리
SELECT snap_id, pga_target_for_estimate/1024/1024 AS mb,
       pga_target_factor,
       estd_pga_cache_hit_percentage,
       estd_overalloc_count
FROM dba_hist_pga_target_advice
ORDER BY snap_id, pga_target_for_estimate;

오늘은 여기까지~

 

728x90