您的位置:首页 > 数据库 > Oracle

oracle内存结构

2009-09-28 17:15 239 查看
Oracle服务器由两部分实体组成:实例和数据库。实例是内存结构和进程,数据库是磁盘文件。本文主要介绍Oracle实例的内存结构。

Oracle实例的组成包括被称为系统全局区(SGA)的共享内存块,以及大量的后台线程。

SGA的组成分为两部分,一类是必选的,一类是可选的。

必选部分:

数据库高速缓存区

日志缓冲区

共享池

用户会话还需要服务器端内存。该内存被称为程序全局区(PGA,program global area),这些内存不共享,每个会话都有自己的PGA。

可选部分:

大池

java池

流池

对于SGA的管理,大多数都能自动完成,DBA也可以进行控制。通常情况是自动控制。

数据库高速缓存区:Oracle执行SQL的工作区域。任何用户会话(客户端进程)都不是直接操作磁盘文件的数据。对于数据库的操作,都需要经过数据库高速缓存区。更新时,首先从磁盘文件中将数据读取出来存入数据库高速缓存区,然后对缓存区进行更新。查找时也是如此,先从磁盘文件中读取到缓存区,然后在从缓存区到用户会话。任何数据库操作需要的数据,都是首先从缓存区中查找,如果没有的话才进行磁盘文件操作。这样就能降低IO频率,提高效率。

数据库高速缓存区有一个“脏数据”的概念。即:缓存区中数据与磁盘文件数据不一致。这个问题由Oracle的后台写入进程来解决。任何数据在被使用后,都会在缓存区中驻留一定的时间。这个时间是不确定的,后台写入进程会定时的将缓存区中的数据写入到磁盘中,这样也确保了缓存区与磁盘文件数据的一致性。

数据库高速缓存区的大小对数据库的性能有至关重要的影响。在Oracle9i之后,数据库高速缓存区的大小可以动态的调整,也可以自动的调整。

日志缓冲区:日志缓冲区是更改矢量的小型短期临时区域。此后,更改矢量会写入到磁盘上的重做日志文件。“更改矢量”是应用于对某些对象的修改,执行DML语句会生成更改矢量。

会话服务器进程不将重做日志直接写入重做日志文件,否则每当执行DML语句时,会话不得不等待完成IO磁盘操作。为了提高性能,会话将重做写入到内存中的日志缓冲区。此后,日志缓冲区再写出到重做日志文件。日志缓冲区对磁盘的写入是来自多个事务的一批更改矢量。日志缓冲区的更改矢量是准实时写入磁盘,每当会话发送commit语句时,都会执行日志缓冲区写入操作,该任务有日志写入器后台进程LGWR完成。

日志缓冲区通常都比较小,大缓冲区对性能会产生极坏的影响,不能设置比默认值更小的缓冲区。为什么大日志缓冲区会对性能产生影响呢?问题在于:发出commit请求后,一部分提交处理需要将日志缓冲区的内容写入到磁盘上的重做日志文件,写操作实时执行,此时commit会话将被挂起。这就意味着在写操作结束之前,不能将完成提交的消息返回给会话。大日志缓冲区意味着:在发出COMMIT语句时,需要写入的内容更多,在发出完成提交消息以及会话恢复工作之前,需要耗费的时间更长。

日志缓冲区在实例启动后不能调整大小。它是循环缓冲区,更改矢量被写出后,原缓冲区变得可用。如果更改矢量的生成速度大于日志写入器进程的写出速度,在日志写入器清理缓冲区时,所有的DML活动都会停止数毫秒。在Oracle体系结构中,将日志缓冲区转储到磁盘是基本瓶颈之一。DML的速度不能超过LGWR将更改矢量转储到联机重做日志文件的速度。如果产生此瓶颈,唯一的解决方案是使用RAC。在RAC中,每个实例都有自己的日志缓冲区,自己的LGWR。

共享池
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: