原创

Oracle的内存结构

Oracle消耗的内存的分为两部分,即进程共享部分和进程专有部分。此处的进程专指Oracle进程(服务器进程和后台进程),进程共享部分为系统全局区(Shared Global Area,SGA),进程专有部分为程序全局区(Program Global Area,PGA)。
1、PGA包含每个服务器进程的数据和控制信息。服务器进程是用来处理客户机请求的进程。每个服务器进程都有在服务器进程启动时创建的自己专用的PGA,只有该服务器进程才能访问。一般情况下,PGA内存包含以下组件:
(1)专用SQL区
专用SQL区包含绑定信息和运行时内存结构之类的数据。发出SQL语句的每一个会话均拥有一个专用SQL区。
一个游标的专用SQL区可分为两个区:
a、永久区:包含绑定信息,只在关闭游标时释放;
b、运行时区:在执行请求时的第一步创建。对于insert、update、delete命令,该区在执行语句后释放。对于查询操作,该区在提取所有行或取消查询后释放。
专用SQL区的位置取决于为会话建立的连接。在专用服务器环境中,专用SQL区位于各自服务器进程的PGA中。在共享服务器环境中,专用SQL区位于SGA中。
用户进程所能分配的专用SQL区数量由初始化参数OPEN_CURSORS来限制。
(2)会话内存
会话内存包含为保留会话变量及与该会话有关的其他信息而分配的内存。对于共享服务器环境,会话内存是共享的。
(3)SQL工作区
SQL工作区用于大量占用内存的操作,比如排序、散列联接、位图合并和位图创建。
2、SGA是一组共享的内存结构,其中存储了Oracle数据库实例的数据和控制文件信息。SGA和Oracle的进程组成了Oracle实例。SGA可以动态调整大小,在初始化参数中可以设置sga_max_size参数。
系统全局区包含:共享池、数据库高速缓冲区、重做日志缓冲区等其他结构。
(1)数据库高速缓冲区
数据库高速缓冲区是SGA区中专门用来存放从数据文件读取的数据块副本,对于所有的Oracle进程都是共享的,并且与共享池一样,被分为多个集合,降低多CPU系统的争用问题。最近最少使用(LRU)列表能反应数据库高速缓冲区的使用情况。服务器进程使用数据库高速缓冲区缓存中的缓冲区,Oracle数据库后台写入进程通过更改的缓冲区写回数据文件使高速缓存中的缓冲区变为可用状态。
(2)数据字典缓冲区
数据字典缓冲区用于存放数据字典信息,在数据库系统启动时分配,是共享内存空间。
(3)重做日志缓冲区
重做日志缓冲区的目的是在数据库崩溃时可以进行恢复数据库。重做日志缓冲区是SGA中连续且循环使用的内存空间。重做日志缓冲区的大小由初始化参数LOG_BUFFER指定,越大越好,这样就能够缓存更多的重做日志,事务被挂起的可能性将减少,LGWR后台进程写重做日志文件的次数将减少,这样将提高数据库的性能。
(4)SQL共享池
Oracle共享池属于SGA,由库高速缓存和数据字典高速缓存组成。
引入库高速缓存的目的是共享SQL和PL/SQL代码。Oracle使用LRU队列和算法来管理库高速缓存。当Oracle执行SQL时,会将相关的数据文件、表、索引、列、用户、其他数据对象的定义和权限存放到数据字典高速缓存中。
Oracle不能直接修改库高速缓存和数据字典高速缓存的大小,只能通过修改共享池的大小来间接修改:

alter system set shared_pool_size = xxx m

正文到此结束
该篇文章的评论功能已被站长关闭