系统全局区(System Global Area,SGA)是所有用户进程共享的一块内存区域,也就是说,SGA中的数据资源可以被多个用户进程共同使用。每个Oracle实例都用一个很大的内存结构来缓存数据,这样可以减少磁盘物理I/O次数,提高系统性能。当启动一个实例时,该实例就占用了操作系统的一定内存——这个数量是基于初始化参数文件中设置的SGA部件的尺寸。当实例关闭时,由SGA使用的内存将退还给主系统内存。
说明:SGA随着数据库实例的启动而加载到内存中,当数据库实例关闭时,SGA区域也就消失了。
Oracle又把SGA分为更多的内存区域,以缓存不同种类的数据。SGA中的主要区域包括下述几部分。
(1)高速数据缓冲区
高速数据缓冲区(data buffer cache)为了减少数据库的物理I/O次数,提高性能,Oracle在从磁盘数据文件检索数据之后或将数据块写入磁盘之前,都要将数据块缓存到数据缓冲区中。由于Oracle数据库除标准块(如8 KB)外,还允许使用其他4种非标准块(2 KB、4 KB、16 KB和32 KB),所以数据缓冲区缓存也分为标准块缓冲区缓存和非标准块缓冲区缓存。
①标准块缓冲区缓存。通常,一个默认的数据缓冲区缓存足以满足大多数系统的需要。但正如大家所熟知的,数据库应用程序中不同表的数据使用频度是不同的,有些表的数据使用频率极高,需要长久缓存;有些表的数据使用频率非常低,使用之后即可从缓存中清除;其余数据的使用频度则介于二者之间,它们中的数据在缓存空间允许的情况下应尽可能长时间地缓存于缓冲区中。如果Oracle需要缓存新的数据,则按照其内部算法把使用频度较低的数据从缓冲区缓存清除掉,为其他数据块提供缓存空间。
针对这种情况,Oracle将标准块缓冲区缓存划分为3种:保持池、循环池和默认池,分别用于缓存上述3种表的数据。这3种缓存的大小分别用初始化参数db_keep_cache_size、db_recycle_cache_size、db_cache_size设置。
配置多个缓存区可以更充分地发挥缓冲区缓存的效率。在创建表时,使用STORAGE子句指定表中数据要使用哪种缓冲区缓存。例如,下面语句创建的tkeep、trecycle和tdefault表将分别使用保持池、循环池和默认池。
如果在创建表时未明确指出使用哪种缓冲区缓存,Oracle则把它放在默认池中。
②非标准块缓冲区缓存:非标准块缓冲区缓存的大小由初始化参数db_n_cache_size指定,其中n是标准块大小之外的其他4种尺寸。
在数据库内创建非标准块表空间时,必须先为这种尺寸的数据块分配缓冲区。例如,下面的SQL语句为16 KB数据块分配50 M的缓存空间。
(2)重做日志缓冲区
服务器进程把执行数据修改(如插入、修改和删除等操作)过程中产生的重做日志写入重做日志缓冲区(redo log buffer),然后由日志写入进程(LGWR)把日志缓冲区内的重做日志写入磁盘中的联机重做日志文件。
重做日志缓冲区的大小由初始化参数log_buffer指定。Oracle内部把日志缓冲区看作一个环形区域。当日志写入进程把部分重做日志写入日志文件后,服务器进程即可循环使用它,用新的重做日志覆盖旧日志。
(3)共享池
共享池(shared pool)是SGA中一个非常重要的区域,它对SQL语句的执行性能有很大影响。共享池的大小由shared_pool_size参数指定,它又分为以下几个主要子区域。(www.daowen.com)
①数据字典缓存。在首次执行SQL、PL/SQL代码时,服务器进程首先要解析其代码,生成执行计划。在解析过程中需要检索SQL语句操作的数据库对象及其定义、用户和权限等信息,这些信息存储在数据库的数据字典内。数据字典缓存用于缓存这部分信息,以减少解析代码时的磁盘I/O次数。
②库缓存。库缓存用于缓存解析过的SQL、PL/SQL语句的执行计划。服务器进程在执行SQL、PL/SQL代码时,首先从库缓存中查找其执行计划,如果找到,则重用该代码,这称为软解析或库缓存命中。否则,Oracle必须生成该代码的执行计划,这被称为硬解析。
③服务器结果缓存。服务器结果缓存用于缓存SQL语句的查询结果集合和PL/SQL函数的结果集。这与数据库缓冲区缓存不同,后者用于缓存数据块。
(4)大型池、Java池
大型池(large pool)是一个可选内存区域,它由large_pool_size参数设置,用于分配不适用于在共享池内分配的大块内存,如RMAN备份所需的缓冲区、语句并行执行所使用的缓冲区等。
Java池(Javapool)用于存储与所有会话相关的Java代码和Java虚拟机(JVM)内的数据。它由java_pool_size参数设置。
(5)流池
Oracle Streams是Oracle提供的一个组件,它允许在不同数据库和应用程序之间共享数据。流池(stream pool)专门为Oracle Streams组件所使用,用于缓存流进程在数据库间共享数据所使用的队列消息,它由streams_pool_size参数设置。
缓存是影响Oracle性能的主要因素之一。在服务器内存一定的情况下,合理分配缓存可大大提高数据库的性能。对于有经验的DBA来说,可以采用分配方式给自己分配各部分的内存量。而对于经验不足的DBA来说,则可以利用Oracle的自动内存管理方式让其代为管理各部分之间的内存分配。影响Oracle数据库内存自动分配的初始化参数见表4.1。
表4.1 影响Oracle数据库内存自动分配的初始化参数
续表
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。