Oracle内存结构:
分配给Oracle实例的数据区域为:系统全局区域(System Global Area, SGA)
Oracle的可执行代码驻留在软件代码区域中,称为:程序全局区域(Program Global Area, PGA),对于第个服务器和后台进程来说都是私有的。Oracle为第个进程分配一个PGA。
一、系统全局区域(SGA)
用于oracle实例的一组共享内存结构,由数据库实例的用户共享。
启动Oracle实例时,系统根据在初始参数文件中指定的值或硬码在Oracle软件中的值,为SGA分配内存。
SGA_MAX_SIZE参数:所有SGA不同部分大小必须不能超出SGA_MAX_SIZE的值。
如果没有指定SGA_MAX_SIZE,但指定了参数SGA_TARGET,Oracle会自动调整SGA各组成部分的大小,使分配的内存总量等同于SGA_TARGET.
MEMORY_TARGET是Oracle11g中新增加的参数,用于在SGA和PGA之间平衡Oracle可用的所有内存,以优化性能。
1、缓冲区缓存
缓冲区缓存保存来自于磁盘的数据块,这些数据块有的满足最近执行的select语句,有的是通过DML语句改变或添加的已修改的块。
DB_CACHE_SIZE
DB_nK_CACHE_SIZE
Oracle可以使用两个具有相同块大小的额外缓存作为默认(DB_CACHE_SIZE)块大小:KEEP缓存池和RECYCLE缓冲池。
创建表时,能过STORAGE子句中使用BUFFER_POOL_KEEP和BUFFER_POOL_RECYCLE子句,可以指定表的数据块驻留在哪个缓冲池中。
对于一天中频繁使用的表,最好将其放在KEEP缓冲池中,从而最小化检索表中数据块所需的I/O。
2、共享池
包含两个主要的子缓存:库缓存和数据字典缓存。
共享池大小参数:SHARED_POOL_SIZE,为动态参数,可以大小调整,只要SGA的全部大小小于SGA_MAX_SIZE或SGA_TARGET即可。
(1)库缓存:保存针对数据库运行的SQL、SQL执行计划及解析树、PL/SQL语句的有关信息。不同的数据库用户可以共享相同的SQL语句。
可以改进查询或DML语句的执行时间。
如果库缓存过小,则必须将执行计划和解析树转储到缓存外面。可以监控库缓存效率。
(2)数据字典缓存:是数据库表的集合,由SYS和SYSTEM模式拥有。包含有关数据库、数据库结构以及数据库用户的权限和角色的元数据。
帮助处理用户查询和其他DML命令。
如果数据字典缓存太小,对数据字典中信息的请求将造成额外的I/O,称为“递归调用”,可通过设置数据字典缓存的大小来避免这种请求。
3、重做日志缓冲区
保存对数据文件中的数据块最近的改动。当重做日志缓冲区的1/3已满或每隔3秒时,Oracle将重做日志记录写入至重做日志文件中。
Oracle10g开始,当重做日志缓冲区中存储了1MB重做信息时,LGWR进程将重做日志记录写入至重做日志文件中。对数据库恢复起着至关重要的作用。
只有将重做日志条目成功写入至重做日志文件后,才可以认为用户提交的事务完成。
LOG_BUFFER:指定日志缓冲区的大小
4、大型池
是SGA的可选区域。用于与多个数据库交互的事务、处理并行查询的消息缓冲区以及RMAN并行备份和恢复操作。
大型池可为需要一次分配大块内存的操作提供所需的大块内存。
LARGE_POOL_SIZE参数:控制大型池的大小。oracle 9i版本2开始新增加的一个动态参数。
5、Java池
Oracle的Java虚拟什么JVM,使用Java存储处理用户会话中的所有的Java代码和数据。
JAVA_POOL_SIZE:指定Java池大小
6、流池
Oracle10g新增的池。
STREAMS_POOL_SIZE可确定流池的大小。如果没有设置值,则从共享池中分配用于流操作的内存,并且最多可分配共享池10%的容量。
用于保存Oracle流特性的数据和控制结构,管理分布式环境中数据和事件的共享。
二、程序全局区域(PGA)
是分配给一个进程并用为该进程所私有的内存区域。
PGA配置取决于Oracle数据库的连接配置:共享服务器或专用服务器。
在共享服务器中,多个用户共享一个数据库连接,由SGA而不是由PGA来保存用户的会话信息。适应条件:对于大量同时进行的数据库连接,以及很少发生的或短期的请求。
在专用服务器环境中,每个用户进程获得自己的数据库连接,PGA包含这种配置的会话内存。
PGA也包括一个排序区域,当用户请求需要排序、位图合并或散列连接操作时,就会使用这种排序区域。
PGA_AGGREGATE_TARGET参数、WORKAREA_SIZE_POLICY参数,DBA可以选择所有工作区域的全部大小,并让Oracle管理并分配所有用户进程之间的内存,从而简化系统管理。
三、软件代码区域
存储作为Oracle实例一部分运行的Oracle可执行文件。代码区域是静态的,只在安装新的软件版本时才会改变。
软件代码是严格只读的代码,可以共享安装或非共享安装。