内存结构—SGA

系统 1694 0

Oracle的内存结构包括SGA系统全局区,PGA程序全局区和软件代码区

1.SGA

   所有的用户进程,服务器进程都可以共同使用SGA区,这是不同用户进程与服务器进程进行通信的中心。

   SGA分为如下几个部分:

   1)数据高速缓存

       A)用于保存的是最近从数据文件中读取的数据块,或存储最近经常使用的数据,其中的数据可以被所有用户共享。

       B)该部分的大小由初始化参数DB_CACHE_SIZE指定,一般是数据库大小的1%

       C)该部分又由3个较小的缓存池组成,每一个缓存池用来存储不同访问特性的数据,以便提高效率。用户还可以

           为特定的对象(如创建,更改表或索引时)使用storage子句中指定BUFFER_POOL参数来设置该对象使用

           缓存池。

           a)keep 保持缓存池:其中的数据(即缓存块)将长期保存,直到数据库关闭。适用于想在内存中长期保存并

                       频繁访问的对象,如代码表。

           b)recycle回收缓存池:其中的数据一旦使用完毕就会被换出。

           c)default默认缓存池:对象默认使用该缓存池。oracle使用LRU最近最少使用算法来换出。

           注意:keep,和recycle的大小由初始化参数BUFFER_POOL_KEEP和BUFFER_POOL_RECYCLE来指定

                    参数DB_CACHE_SIZE减去这两个参数的值后余下的就是default的大小

       D)数据高速缓存由许多大小相等的缓存块组成。大小与OS块相同。可分为3类

          a)dirty buffers脏缓存块:当一个SQL语句对某个缓存块中的数据进行修改后,这个缓存块就被标记为脏缓存块,

                 该块的数据将来会被持久化到数据文件。

          b)free buffers空闲缓存块:这些块中没有数据,它们在等待被写入数据。

          c)pinned buffers命中缓存块:保存的是最近正在被访问的数据。这些数据将始终被保存在内存中。

       E)Oracle通过如下2个列表管理上诉缓存块:

          a)dirty列表:保存已经被修改但还没有被写入数据文件的脏缓存块

          b)LRU列表:保存命中,空闲以及还没被移入dirty列表中的脏缓存块。LRU列表可以被看成为一个队列。

                   被经常访问的在队头,放在队尾的将最先被移除。

                内存结构—SGA      

 

2.重做日志高速缓存

   用于记录insert,update,delete语句及create,alter,drop等语句的重做记录。由参数log_buffer制定。

3.共享池

       保存了最近执行的SQL语句,PL/SQL过程与包,数据字典信息,锁,以及其他控制结构信息。它是对SQL,

   PL/SQL进行语法解析,编译,执行的内存区,主要由数据字典缓存区和库缓存区组成。由shared_pool_size指定。

   1)数据字典缓存(dictionary cache)

       A)用于存储最近经常使用的数据字典信息,如表定义,列定义,用户名,口令,权限,数据库的结构等信息。

       B)Oracle运行时需访问数据字典来解析SQL,确定对象是否存在,验证权限。如果数据在缓存中不存在,

          则取读取数据字典的数据文件。

       C)数据字典缓存中存储的是一条一条的记录,而其他缓存区保存的是数据块

   2)库缓存

        用于保存最近解析过的SQL语句PL/SQL

        Oralce将每条SQL分解为可共享和不可共享的部分,分别存储在共享SQL区和私有SQL区

        A)共享SQL区:存储的是最近执行的SQL语句,解析后的语法树和优化后的执行计划

        B)私有SQL区:存储与会话和用户相关的私有信息,如:绑定变量,环境,和会话参数。

        C)PL/SQL过程和包区:存储PL/SQL解析的执行代码。PL/SQL中的SQL还是存储在共享SQL区中

        D)锁与其他控制结构区:存储Oracle实例内部操作所需要的信息,如各种锁,闩,寄存器值等。后台进程需要

               访问他们。

4.大池(可选)

   大池用于为需要大内存的操作提供相对独立的内存空间,以便提高这些操作的性能。通过large_pool_size确定大小

   需要大量内存的操作包括:

   1)数据库备份和恢复,如使用RMAN在磁带设备上执行备份,转储,恢复等操作。

   2)具有大量排序操作的SQL语句。

   3)并行化的数据库操作。

   注意:如果没有在SGA区中创建大池,上诉操作所需的内存空间将占据共享池的内存

5.Java池(可选)

   在Oracle 8i之后,Oracle增加了对Java语言的支持,提供了Java池,用于存放Java代码,Java语句的语法分析表

   Java语句的执行方案和进行Java程序开发。使用java_pool_size确定大小

内存结构—SGA


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论