当一个Oracle实例开始运行的时候,会分配一个称为SGA(系统全局区)的大的内存块(如下所示数据库启动时显示的数据信息)。
=========================================
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 83888372 bytes
Database Buffers 79691776 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
=========================================
系统的SGA被该实例的所有后台进程共享。在SGA中,包括以下的几个缓存池。
①数据库高速缓冲区DBbuffer②大共享区③共享池④日志缓冲池Redo buffer⑤固定SGA
数据库高速缓冲区:
如果每次执行一个SQL查询的时候,Oracle都必须从磁盘读取数据块,并且每个改变都需要写入磁盘的话,那么Oracle的执行效率将非常的低。而DBbuffer经常能够使用内存中的数据块,在那里就能很快的得到访问。内存中用来频繁访问的区域就被称之为数据库高速缓冲区。
数据库高速缓冲区是SGA的区域里面最大的部分,包括以下的三个缓存池:
①保持缓存池:想在内存中长期保存和频繁访问(如代码表)而使用的缓存池。此缓冲池在关闭数据库之前一直保留,并不从内存中释放空间。
②再生缓存池:想尽快从内存中排除的对象使用此缓存池。(如频繁访问的大表)
③默认缓存池:除以上两种情况外的选择。
共享池也是Oracle当中一个非常重要的缓存区域,主要由库缓冲区和字典缓冲区所构成。用来缓存PL/SQL的程序单元,SQL语句的执行版本和相关的执行计划。共享池规模对数据库的性能有着重要的影响。
在库缓冲区又包括共享SQL区和PL/SQL区。在SQL区中保留了SQL语句的解释版本,以便再次使用的时候不必重新解释,目的是使这些语句再次执行的时候,能够提高进程的速度。PL/SQl区保留了PL/SQL的过程,函数等编译版本,以便于所有的用户能够共享。当程序执行一个PL/SQL的执行单元的时候,当有两个或者两个以上用户需要执行相同的过程,函数或者触发器等相关内容的时候,Oracle并不缓存两个或者两个以上的内存区域。Oracle的处理是,把相同的代码做一个拷贝,被不同的用户所缓存。
字典缓存区是用来缓存数据字典信息的一个区域。当分析SQL语句来校验表名,列名,数据类型等信息的时候,Oracle将频繁的提到数据字典。通过把对最频繁使用的信息存储到内存中,Oracle减少了相关SQL语句所引起的相关性能上的冲突。
Redo日志缓冲池是用来放置写入磁盘的Redo日志记录。循环方式,先进先出。
大共享区是Oracle的一个可选的特征。它提供了大内存块的隔离内存区。如果选择多线程的服务器,或者进行备份和相关的RMN等相关操作的时候,需要这个区域。
固定SGA区不能人为设定大小,是Oracle数据库自己控制的。