系统全局区(SGA:system global area)
多个用户同时连接数据库时,所有的用户进程、服务进程都可以共享使用SGA区。是不同用户进程与服务进程进行通信的中心。数据库的所有操作主要都在SGA区中进行。当数据库实例启动时,系统全局区内存被自动分配。SGA按作用的不同,又分为:数据缓冲区、日志缓冲区、共享池。
数据缓冲区
数据缓冲区用于存储从磁盘数据文件中读入的数据,供所有用户共享。修改、插入的数据存储在数据缓冲区中,修改完成或DBWR进程执行时,数据被写入数据文件。对于缓冲区中已经被修改但尚未写入文件的数据,我们称之为“脏数据”。Oracle采用LRU(最近最少用)算法来管理数据缓冲区中的数据。
缓冲区的设置对性能影响是很突出的。设一个查询要读取的数据块数为A,能够从缓冲区读取到的数据块数为C,需要从磁盘读取的数据块数为D,那么A+C+D称为物理读,则C/A称为数据缓冲区的命中率
日志缓冲区
日志缓冲区用于缓冲事务日志,在适当的时候再由LGWR进程写入日志文件。当执行insert,update,delete等语句对表进行修改,或执行create,alter,drop等语句修改方案对象时,oracle会为这些操作生产重做记录,日志缓冲区就缓存这些重做记录的。
共享池
共享池保存了最近执行的sql语句、PL/SQL程序和数据字典信息,是对sql语句和PL/SQLd程序进行语法分析、编译、执行的内存区。包括:库缓冲区(library cache),数据字典缓冲区(data dictinary cache)两个部分。
大池
大池用于为需要大内存的操作提供相对独立的内存空间,以便提高这些操作的性能。大池是一个可选的内存结构。
JAVA池
用于存放java代码、java语句的语法分析表、java语句的执行方案和进行java程序开发。
程序全局区(PGA:program global area)
PGA区是在用户进程链接到数据库,并创建一个对应的会话时,由oracle为服务进程分配的,专门为当前用户会话的内存区。这个内存区是非共享的,只有服务进程本身才能访问它自己的PGA。PAG区的大小由操作系统决定,分配之后不可以更改,会话终止时,oracle会自动释放PGA所占的内存区。包括:
1. 排序区
存放排序操作所产生的临时数据
2. 会话区
保存会话所具有的权限、角色、性能统计信息
3. 游标区
当使用游标时,oracle会在共享池中为该语句分配上下文区。游标区在打开游标时创建,关闭游标时释放,所有尽量避免反复打开、关闭游标
4. 堆栈区
保存会话中的绑定变量、会话变量以及sql语句运行时的内存结构。
--转自