当用户请求数据库中的数据时,Oracle实际上会先检测内存中是否存在相应的数据块,因为从内存中获取数据往往要比磁盘快很多,只有在Oracle无法找到内存中的数据时,才会去磁盘中提起数据,Oracle除要使用内存缓冲数据外们还会缓冲Oracle的共享可执行的SQL或PL/SQL代码,同时Oracle也会使用内存来管理重做日志。基本上Oracle数据库需要大量的内存来管理数据库,内存越大,意味着访问的速度越快。
Oracle内存结构
Oracle会在内存中存储一下信息:
- 已经执行过的SQL或PL/SQL代码;
- 已经连接的会话信息,包括当前活动的及非活动的会话;
- 程序执行过程中所需要的信息,比如某个查询的状态;
- 需要在Oracle进程间共享并通信的信息;
- 数据文件内数据的缓存,例如数据块及重做日志项;
Oracle将内存划分为两种内存结构:
- 系统全局区,全称是 System Global Area,简称SGA,这个区域中的数据会被所有的服务器进程和后台进程所共享
- 程序全局区,全称是 Program Global Area,简称PGA,每个服务器和后台进程私有的内存区域,即每个进程都具有自己的PGA区域
依赖于服务器的连接方式的不同,在Oracle中还有一个用户全局区 UGA,它是存储在会话状态的内存。如果通过专用服务器连接到Oracle,UGA内存会在PGA区域中分配,如果是共享服务器连接,UGA会在SGA中进行内存分配。
注意:在使用DBCA创建数据库时,DBCA会提示用户选择连接类型,默认使用专用服务器模式。

由图中可以看到,SGA中包含了各种各样的池和缓冲区,比如Java池,大池,流池等,SGA之外的服务器进程和后台进程可以与SGA交换信息,同时每个进程具有自己的PGA内存区域,可以存放进程的私有数据。
系统全局区SGA
系统全局区SGA时一个非常庞大的共享内存结构,它的目的时提高查询性能,允许大量并发的数据库活动。每次Oracle启动时,就会分配指定的SGA内存。SGA区实际上是由一组不同结构的内存组件构成的,他是可读写的。在SGA区中包含了如下几个内存数据结构:
- 数据库缓冲区高速缓存:它用来保存从数据文件中读取的数据块的副本;
- 共享池:包含库高速缓存,用来缓存已经执行过并存储起来的SQL和PL/SQL的已分析过的代码,使得多次访问相同的代码可以进行共享使用。共享池还包含了数据字典高速缓存,用来保存重要的数据字典信息。
- 重做日志缓冲区:用来缓存重做日志项,在指定的条件满足时将缓冲区的数据写入到磁盘中。
- Java池:给出实例化Java对象的栈空间;
- 大池:存储大内存的配置,比如RMAN备份缓冲区;
- 流池:用来支持Oracle流功能
在SGA区中,还包含了一个数据库及实例的状态信息的内存,以供后台进程使用,这部分内容被称为固定SGA(FIXED SGA)。系统全局区的内存组成结构如图所示

可以看到,Oracle在SGA区中包含了很多用来处理数据块操作的组件,通过查询数据库字典试图 V$sgainfo ,可以了解到当前服务器的SGA内存使用状态。
Oracle11g具有自动内存管理机制,在创建数据库时,只需要指定 MEMORY_TARGET 初始化参数指定实例使用的最大内存大小,SGA 和 PGA 会由Oracle根据需要来分配内存。也可以使用 alter system 语句来更改这个内存设置