Oracle专家高级编程 第二章 内存结构

  • SGA,系统全局盘区(System Globa Area),大的共享内存段,所有Oracle进程都在某点访问
  • PGA,进程全局盘区(Process Global Area),对单一进程或线程私有的
  • UGA,用户全局盘区(USER Global Area),与会话相关的内存,在SGA或PGA中,取决于MTS模式(SGA)还是专用服务器(PGA)

PGA和SGA

PGA的内存分配借助于C的runtime调用malloc,并能长时间runtime伸缩,PGA不会在Oracle的SGA之外分配

UGA实际上是会话状态,内存位置依赖于Oracle接受连接实施的位置,都在SGA中;会话使用任意共享服务器

如果使用专用服务器,UGA和PGA同义

对PGA/UGA大小影响最大的是init.ora或会话级参数,控制数据排序空间数量,以及在排序完成后保留多少内存段

  • SORT_AREA_SIZE,分配在PGA中,
  • SORT_AREA_RETAINED_SIZE,分配在UGA中,而UGA又在PGA之内(专用服务器)

V$表可以查询pGA和UGA的大小

专用服务器模式,UGA全部包含于PGA

MTS模式,UGA全部包含在SGA中,PGA在共享服务器中

Oracle中一些进程将显式释放PGA内存,UGA是子堆(sub-heap),父堆(不是PGA就是SGA),用来缩减

SGA

每一个oracle实例都有一个大内存结构,容量变化范围大,从几MB到几百MB,数个GB

SGA是一个物理实体

SGA分为各种池子

Java池(Java pool),分配在数据库上运行的JVM的固定大小的内存

大池(Large pool),大池被MTS用作会话内存,被Parallel Execution(并行计算)用作消息缓冲器;被RMAN Backup用作磁盘IO缓冲期

共享池(shared pool),包含共享游标、存储过程、声明对象、字典高速缓存和其他数据位

空池(null pool),用于块缓冲区(高速缓存的数据库块)、重做日志缓冲区以及固定SGA盘区的内存

Oracle专家高级编程 第二章 内存结构

init.ora中参数对SGA的大小影响:

  • JAVA_POOL_SIZE
  • SHARED_POOL_SIZE
  • LARGE_POOL_SIZE
  • DB_BLOCK_BUFFERS
  • LOG_BUFFER

除了SHARED_POOL_SIZE和LOG_BUFFER两个例外,在init.ora参数和SGA中分配的内存数量有一对一相应关系

固定的SGA

Fixed SGA是SGA的一个组件,根据平台和版本变化而变化

安装时,被"编译"到Oracle二进制文件中,包含一组指向其他SGA组件的变量,包含不同的参数值变量

Fixed SGA大小不可控,是SGA的"自举"部分

重做缓存

redo log需要写到联机重做日志中的数据在写到磁盘上之前临时高速缓存的地方

内存之间的传输远大于内存对硬盘的传输,redo log缓存可以加快数据库的操作速度

数据在重做缓存驻留时间不会太长

  • 每3秒
  • 有人提交时
  • 1/3满时,或包含了1MB的高速缓存的重做日志数据

数10MB用于重做缓存通常是对呢困的浪费,在init.ora中

LOG_BUFFER对应重做缓存的默认大小,最大是512KB和128个CPU

块缓冲区高速缓存

 Oracle专家高级编程 第二章 内存结构

共享池(Shared Pool)

共享池是SGA中最关键的内存片段,特别在性能上和可伸缩性上,太小或者太大的共享池会扼杀性能,是系统暂停

共享池是Oracle高速缓存许多位"程序"数据的地方,分析一个查询时,结果就在高速缓存

如果上千个会话运行相同的代码,装载一个代码副本,所有会话共享它

Oracle在共享池中存储系统参数,数据字典高速缓存是有关数据库对象信息的高速缓存,也在此存储

共享池的特点是有大量的小块内存(约4KB),在LRU基础上管理

中断Oracle共享池的最简单方法是不使用绑定变量(bind variable):

  • 系统话费大量时间分析查询
  • 系统消耗极大资源管理共享池对象,无法重用

大池

用来分配大块内存,处理比共享池更大的内存

Oracle需要类似于为块高速缓冲区高速缓存而实现的回收(RECYCLE)和保持(KEEP)缓冲区

这恰恰是大池和共享池的功能,在大池中分配的内存在堆中管理,内存块一但被释放就会被其他进程使用

哪个内存需要重用,Oracle停止对改内存块的引用,使用大池的对象:

  • MTS--在SGA中分配UGA盘区
  • 语句的并行执行(Parallel Execution of statements)--允许进程间消息缓冲区的分配,协调并行查询服务器
  • 备份(BACK)--用于RMAN磁盘IO缓存

没有一个能在设计来管理小块内存的LRU缓冲区池中管理

Java池(Oracle 8添加的)

Java池总量固定

在专用服务器模式中,Java池包含每个Java类的共享部分实际上被每一个会话使用

在MTS模式下执行时,Java池包括

  • 每个Java类的共享部分
  • 一些用于每个会话状态的UGA,它们在SGA中的java_pool中分配,其他的UGA一般位于共享池,如果配置了大池,UGA在大池分配 
上一篇:《Oracle DBA工作笔记》第二章 常用工具和问题分析(1)--删库、orabase、sqlplus


下一篇:用好HugePage,告别Linux性能故障