이번 주는 오라클 메모리 구조에 대해 간략이 정리해 보려고 한다.

 

우선 크게 SGA vs PGA에 대하여.

SGA (System Global Area)

모든 서버 프로세스가 공용으로 사용하는 영역이다. 즉, DB 인스턴스 별로 하나씩 생성되는 영역이라고 보면 된다. 10g 버전 이후로는 일부 영역이 자동으로 관리된다.

PGA (Program Global Area)

SGA와 달리 개별적으로 사용하는 영역이다. 9i 버전부터 자동으로 관리된다.

 

SGA에 대해 좀 더 자세히 알아보자.

ASSM, sga_target 설정을 0으로 하면 ASSM(Automatic Shared Memory Management)라 불리는 자동 공유 메모리 관리 메커니즘이 꺼진다. 즉 0보다 크게 잡아야 ASSM 기능을 사용할 수 있다. 예를 들어 sga_target을 4G로 설정하면 4G 안에서 알아서 사용하라는 의미가 된다.

단, sga_target에 redo log buffer는 제외된다. 그런데 sga_max_size에는 redo log buffer를 포함하고 있다. sga_max_size는 SGA의 전체 크기이다.

9i 버전부터는 alter system을 통해 동적으로 설정을 변경할 수 있다. (Dynamic SGA) 10g 기준으로 동적 변경이 가능한 설정은 다음과 같다.

  • db_cache_size
  • log_buffer
  • shared_pool_size
  • large_pool_size
  • java_pool_size

Granule, 가상 메모리 내의 메모리 단위, Dynamic SGA에서 할당 가능한 최소한의 단위이다. 기준 단위는 다음과 같다.

  • 9i : sga_max_size가 128M 이하라면, Granule당 4M, 128M 이상이라면 Granule당 16M
  • 10g : sga_max_size가 1G 이하라면, Granule당 4M, 1G 이상이라면 Granule당 16M

 show sga 명령어로 확인해 보자.

SQL*Plus: Release 11.2.0.2.0 Production on Sat Aug 20 14:07:46 2016

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> show sga

Total System Global Area  417546240 bytes
Fixed Size          2227080 bytes
Variable Size         360711288 bytes
Database Buffers       50331648 bytes
Redo Buffers            4276224 bytes
  • Total System Global Area : 전체 SGA 크기
  • Fixed Size : Background process 사용 크기
  • Variable Size : shared pool, large pool, java pool 크기
  • Database Buffers : database buffer cache 크기
  • Redo Buffers : redo log buffer 크기

 

이번에는 PGA에 대해 좀 더 자세히 알아보자.

다음과 같은 용도로 사용된다.

  • 정렬 : order by, group by를 수행할 때 사용
  • 세션 : 사용자 프로세스의 세션 정보를 저장할 때 사용
  • 커서 : SQL의 parsing 정보가 저장되어 있는 어드레스를 저장할 때 사용
  • 변수 : SQL의 bind 변수를 저장할 때 사용

 PGA를 얼마나 잡아야 하는가에 대해서는 사실 정답은 없지만, OLTP성 보다는 DW성 시스템에 더 많은 PGA를 할당하는 것이 일반적이다.