oracle内存结构

参考资料,官方文档

基本内存结构

与Oracle数据库关联的基本内存结构包括:

  • 系统全局区域(SGA)

    SGA是一组共享内存结构,称为SGA组件,包含一个Oracle数据库实例的数据和控制信息。所有服务器和后台进程共享SGA。存储在SGA中的数据的示例包括高速缓存的数据块和共享的SQL区域。

  • 全球计划(PGA)

    PGA是一个非共享内存区域,包含专门供Oracle进程使用的数据和控制信息。Oracle数据库在Oracle进程启动时创建PGA。

    每个服务器进程和后台进程都存在一个PGA 。单个PGA的集合是总实例PGA,或实例PGA。数据库初始化参数设置实例PGA的大小,而不是单个PGA。

  • 用户全局区域(UGA)

    UGA是与用户会话相关联的存储器。

  • 软件代码区域

    软件代码区域是用于存储正在运行或可以运行的代码的内存部分。Oracle数据库代码存储在软件区域中,该区域通常位于与用户程序不同的位置 - 更独特或受保护的位置。

  •                                                 

当数据库实例启动时,系统全局区内存被自动分配。当数据库实例关闭时,SGA内存被回收。 SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。查询SGA。

Fixed Size表示固定区域,存储SGA各个组件的信息。不能修改大小。

Variable Size表示可变区域,比如共享池、java池、大池等。

Database Buffers表示数据库高速缓冲区。

Redo Buffers表示日志缓冲区。

数据高速缓冲区(Database Buffer Cache):用于存放从数据文件读取的数据块,由初始化参数DB_CACHE_SIZE决定。

工作原理和过程是 LRU(最近最少使用 Least Recently Used )。查询时,Oracle会先把从磁盘读取的数据放入内存供所有用户共享,以后再查询相关数据时不用再次读取磁盘。插入和更新时,Oracle会先在该区中缓存数据,之后批量写到硬盘中。通过块缓冲区,Oracle可以通过内存缓存提高磁盘的I/O性能(注:磁盘I/O的速率是毫米级的,而内存I/O的速率为纳秒级)

数据高速缓存块由许多大小相等的缓存块组成,这些缓存块的大小和OS块大小相同。 这些缓存块分为3大类

  • 脏缓存块( Dirty buffers ):脏缓存块中保存的时被修改过的缓存块。即当一条SQL语句对某个缓存块中的数据进行修改后,该缓存块就被标记为脏缓存块。最后该脏缓存块被DBWn进程写入到硬盘的数据文件中,永久保留起来。
  • 命中缓存块( Pinned buffers ):命中缓存块中保存的是最近正在被访问的缓存块。它始终被保留中数据高速缓存中,不会被写入数据文件。
  • 空闲缓存块(Free buffers):该缓存块中没有数据,等待被写入数据。oracle从数据文件中读取数据后,寻找空闲缓存块,以便写入其中。

 

重做日志缓冲区(Redo log buffer)

  •     用于存放日志条目,日志条目就是记录对数据的改变。当这块区域用光时,后台进程LGWR把日志条目写到磁盘上的联机日志文件中。它由初始化参数log_buffer决定大小

共享池(Shared pool)

用于存放SQL语句、PL/SQL代码、数据字典、资源锁和其他控制信息。它由初始化参数SHARED_POOL_SIZE控制其大小。它包含以下几个缓冲区:

 数据字典缓存(data dictionary cache),用于存储经常使用的数据字典信息。比如(表的定义、用户名、口令、权限、数据库的结构等)。Oracle运行过程中经常访问该缓存以便解析SQL语句,确定操作的对象是否存在,是否具有权限等。如果不在数据字典缓存中,服务器进程就从保存数据字典信息的数据文件中将其读入到数据字典缓存中。数据字典缓存中保存的是一条一条的记录(就像是内存中的数据库),而其他缓存区中保存的是数据块信息。

库缓冲区(Library Cache): 库缓存的目的就是保存最近解析过的SQL语句、PL/SQL过程和包。这样一来,Oracle在执行一条SQL语句、一段PL/SQL 过程和包之前,首先在“库缓存”中搜索,如果查到它们已经解析过了,就利用“库缓存”中解析结果和执行计划来执行,而不必重新对它们进行解析,显著提高执行速度和工作效率。

 

大池(Large pool)

大池由初始化参数LARGE_POOL_SIZE确定大小,可以使用ALTER SYSTEM语句来动态改变大池的大小,是可选项,DBA可以根据实际业务需要来决定是否在SGA区中创建大池。如果没有创建大池,则需要大量内存空间的操作将占用共享池的内存, 将对SHARED POOL造成一定的性能影响,而LARGE POOL是起着这种功能隔离作用的一块区域。

ORACLE 需要大量内存的操作有:

   A、数据库备份和恢复,如RMAN某些情况下用于磁盘IO缓冲区

   B、具有大量排序操作的SQL语句

   C、并行化的数据库操作,存放进程间的消息缓冲区

   D、共享服务器模式下UGA在大池中分配(如果设置了大池)

Java池(Java pool)

用于支持在数据库中运行java代码,一般由java_pool_size控制

流池(Stream pool)

加强对流的支持,一般由stream_pool_size控制。流池(或者如果没有配置流池,则是共享池中至多10%的空间)会用于缓存流进程在数据库间移动/复制数据时使用的队列消息

进程全局区(Porcess Global Area, PGA)

一个PGA是一块独占内存区域,Oracle进程以专有的方式用它来存放数据和控制信息。当Oracle进程启动时,PGA也就由Oracle数据库创建了。当用户进程连接到数据库并创建一个对应的会话时,Oracle服务进程会为这个用户专门设置一个PGA区,用来存储这个用户会话的相关内容。当这个用户会话终止时,系统会自动释放这个PGA区所占用的内存。这个PGA区对于数据库的性能有比较大的影响,特别是对于排序操作的性能。所以,在必要的时候合理管理PGA区,能够在很大程度上提高数据库的性能。

PGA是特定于操作进程或线程的内存,不由系统上的其他进程或线程共享。因为PGA是特定于进程的,所以它永远不会在SGA中分配。

PGA是一个内存堆,包含专用或共享服务器进程所需的会话相关变量。服务器进程在PGA中分配它需要的内存结构。

PGA的类比是文件职员使用的临时工作台工作空间。在这个类比中,文件职员是代表客户(客户端进程)工作的服务器进程。职员清理工作台面的一部分,使用工作区存储有关客户请求的详细信息并对客户请求的文件夹进行排序,然后在工作完成后放弃空间。

用户全局区域概述

UGA是会话内存,它是为会话变量分配的内存,例如登录信息,以及数据库会话所需的其他信息。实质上,UGA存储会话状态。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值