Oracle11g内存结构概述

## Oracle11g内存结构概述

内存结构在“Oracle体系结构”中非常重要的,在了解了SGA、PGA等结构原理之后对于SQL语句执行计划可以有一个根本上的认识,对后期SQL语句和数据库性能的优化提供很大帮助。

启动实例后,Oracle数据库会分配一个内存区域并启动后台进程。

内存区域存储如下信息:

①  Overview of the User Global Area       (用户全局区)

②  Overview of the Program Global Area (程序全局区)

③  Overview of the System Global Area   (系统全局区)

④  Overview of Software Code Areas       (软件代码区)

 

一、基本内存结构

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

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

·        程序全局区域(PGA)
PGA是非共享内存区域,其中包含专门供Oracle进程使用的数据和控制信息。启动Oracle进程时,PGA由Oracle数据库创建。 每个服务器进程和后台进程都有一个PGA 。单个PGA的集合是总实例PGA,或者实例PGA。数据库初始化参数设置实例PGA的大小,而不是单个PGA的大小。

·        用户全局区域(UGA)
UGA是与用户会话关联的内存。

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

下图说明了这些内存结构之间的关系

Oracle11g内存结构概述

二、内存结构概述

 

(一)、用户全局区概述UGA

用户全局区(UGA)是会话内存,是为会话变量分配的内存,例如登录信息和数据库会话所需的其他信息。本质上,UGA存储会话状态。
用户全局区结构(UGA)如下图

Oracle11g内存结构概述

如果会话将PL / SQL 程序包加载到内存中,则UGA将包含程序包状态,这是在特定时间存储在所有程序包变量中的一组值。当程序包子程序更改变量时,程序包状态将更改。默认情况下,程序包变量在会话的整个生命周期中都是唯一的。

在OLAP页池也存储在UGA。该池管理OLAP数据页,这些数据页等效于数据块。页面池在OLAP会话开始时分配,并在会话结束时释放。每当用户查询诸如多维数据集之类的维对象时,OLAP会话就会自动打开。

在会话的生存期内,UGA必须可用于数据库会话。因此,在使用共享服务器连接时,UGA无法存储在PGA中,因为PGA特定于单个进程。因此,使用共享服务器连接时,UGA将存储在SGA中,从而使任何共享服务器进程都可以对其进行访问。使用专用服务器连接时,UGA存储在PGA中。

 

(二)、程序全局区概述PGA

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

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

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

下图显示了未为共享服务器配置的实例的实例PGA(所有PGA的集合),您可以使用初始化参数来设置实例PGA的目标最大大小,各个PGA可以根据需要增长到此目标大小

Oracle11g内存结构概述
其中:
PGA细分为不同的领域,每个领域都有不同的用途。下图显示了专用服务器会话的PGA可能的内容。并非在所有情况下都存在所有PGA区域。
Oracle11g内存结构概述

专用SQL
一个私有SQL区保存有关解析的SQL语句以及处理其他特定会话的信息。当服务器进程执行SQL或PL / SQL代码时,该进程使用私有SQL区域存储绑定变量值,查询执行状态信息和查询执行工作区。

不要将UGA中的专用SQL区域与共享的SQL区域混淆,后者将执行计划存储在SGA中。相同或不同会话中的多个私有SQL区域可以指向SGA中的单个执行计划。例如,SELECT * FROM employees一个会话中的20次执行和不同会话中的同一查询的10次执行可以共享同一计划。每次执行的专用SQL区域不共享,可能包含不同的值和数据。

甲光标是一个名字或处理特定的专用SQL区域。如下图所示,您可以将游标视为客户端上的指针和服务器端上的状态。因为游标与私有SQL区域紧密相关,所以有时可以互换使用这些术语。

Oracle11g内存结构概述
专用SQL区域分为以下几个区域:

“运行区”

该区域包含查询执行状态信息。例如,运行时区域跟踪全表扫描到目前为止检索到的行数。

Oracle数据库创建运行时区域作为执行请求的第一步。对于DML语句,在关闭SQL语句时将释放运行时区域。

“持久区域”

该区域包含绑定变量值。执行语句时,绑定变量值将在运行时提供给SQL语句。仅当关闭光标时,才释放持久区域。

客户流程负责管理专用SQL区域。专用SQL区域的分配和取消分配很大程度上取决于应用程序,尽管客户端进程可以分配的专用SQL区域的数量受初始化参数的限制OPEN_CURSORS。

尽管大多数用户依赖于数据库实用程序的自动游标处理,但是Oracle数据库编程接口为开发人员提供了对游标的更多控制。通常,应用程序应关闭所有不再使用的打开的游标,以释放持久区域并最小化应用程序用户所需的内存。

SQL工作区
一个工作区是用于内存密集型操作PGA内存的私人分配。例如,排序运算符使用排序区域对一组行进行排序。同样,hash join运算符使用hash area从其左侧输入构建hash table,而位图合并使用位图合并区域合并从多个位图索引的扫描中检索到的数据。
下图查询语句结果显示了一个连接的employees,并departments与它的查询计划。

在这个示例中,运行时区域跟踪全表扫描的进度。会话在hash area中执行hash join,以匹配两个表中的行。该ORDER BY排序发生在排序区。

如果操作员要处理的数据量不适合工作区域,则Oracle数据库会将输入数据分成较小的部分。这样,数据库将处理内存中的某些数据,同时将其余数据写入临时磁盘存储中,以供以后处理。

启用自动PGA内存管理后,数据库会自动调整工作区大小。您还可以手动控制和调整工作区的大小。

通常,较大的工作区域可以以较高的内存消耗为代价显着提高操作员的性能。最佳地,工作区的大小足以容纳由其关联的SQL运算符分配的输入数据和辅助存储器结构。否则,响应时间会增加,因为必须将部分输入数据缓存在磁盘上。在极端情况下,如果工作区的大小与输入数据的大小相比太小,则数据库必须对数据进行多次传递,从而大大增加了响应时间。

 

专用和共享服务器模式下的PGA使用情况
PGA内存分配取决于数据库使用专用服务器还是共享服务器连接

专用服务器和共享服务器之间的内存分配差异
Memory Area Dedicated Server Shared Server

Nature of session memory

Private

Shared

Location of the persistent area

PGA

SGA

Location of the run-time area for DML/DDL statements

PGA

PGA

 

(三)、系统全局区概述SGA

SGA是一个读/写存储区,与Oracle后台进程一起,构成了一个数据库实例。代表用户执行的所有服务器进程都可以读取实例SGA中的信息。在数据库操作期间,有几个进程写入SGA。

每个数据库实例都有自己的SGA。Oracle数据库在实例启动时自动为SGA分配内存,并在实例关闭时回收该内存。当使用SQL * Plus或Oracle Enterprise Manager启动实例时,SGA的大小如下例所示:

上图所示,SGA由几个内存 组件组成,它们是用于满足特定类别的内存分配请求的内存池。除重做日志缓冲区外的所有SGA组件均以称为颗粒的连续内存为单位分配和取消分配空间。颗粒大小是特定于平台的,并由SGA的总大小决定。

您可以在视图中查询有关SGA组件的信息。

最重要的SGA组件如下:

  • Database Buffer Cache

  • Redo Log Buffer

  • Shared Pool

  • Large Pool

  • Java Pool

  • Streams Pool

  • Fixed SGA

 

数据库缓冲区缓存(Database Buffer Cache

数据库缓冲区缓存也称为(缓冲区缓存),是存储从数据文件读取的数据块副本的内存区域。缓冲区是主内存地址,缓冲区管理器在其中临时缓存当前或最近使用的数据块。所有并发连接到数据库实例的用户共享对缓冲区缓存的访问。

Oracle数据库使用缓冲区高速缓存来实现以下目标:

  • 优化物理I / O

    数据库更新缓存中的数据块,并将有关更改的元数据存储在重做日志缓冲区中。在之后,数据库将重做缓冲区写入磁盘,但不会立即将数据块写入磁盘。而是,数据库编写器(DBW)在后台执行延迟写入

  • 将经常访问的块保留在缓冲区高速缓存中,并将不经常访问的块写入磁盘

    数据库智能闪存高速缓存(闪存缓存)启用,缓冲区高速缓存的一部分可以驻留在闪存高速缓存。此缓冲区高速缓存扩展存储在闪存设备上,该设备是使用闪存的固态存储设备。通过在闪存中缓存缓冲区而不是从磁盘读取,数据库可以提高性能

 

缓冲状态(Buffer States

数据库使用内部算法来管理高速缓存中的缓冲区。缓冲区可以处于以下任何互斥状态:

  • 没用过(Unused)

    该缓冲区可供使用,因为它从未使用过或当前未使用。这种类型的缓冲区是数据库最容易使用的缓冲区。

  • 清洁(Clean)

    该缓冲区较早使用,现在包含一个时间点上块的读取一致版本。该块包含数据,但是是“干净的”,因此不需要检查点。数据库可以固定该块并重新使用它。

  • 脏(Dirty)

    缓冲区包含尚未写入磁盘的已修改数据。在重新使用之前,数据库必须检查该块。

每个缓冲区都有一个访问模式:固定空闲(未固定)。缓冲区被“固定”在高速缓存中,这样在用户会话访问它时,它不会在内存中老化。多个会话无法同时修改固定的缓冲区。

数据库使用复杂的算法来提高缓冲区访问的效率。指向脏缓冲区和非脏缓冲区的指针存在于相同的最近最少使用(LRU)列表中,该列表具有热端和冷端。一个缓冲是一个还没有被最近使用过的。一个热缓冲被频繁访问,并已最近使用过的。

 

缓冲模式(Buffer Modes

当客户端请求数据时,Oracle数据库会以下列两种方式从数据库缓冲区高速缓存中检索缓冲区:

  • 当前模式

    一个电流模式获取,也称为DB块获取,是块的检索,因为它目前出现在缓冲区高速缓存。例如,如果未提交的事务已更新了块中的两行,则当前模式get将使用这些未提交的行检索该块。数据库使用db块在修改语句期间获取频率最高,该语句必须仅更新该块的当前版本。

  • 一致模式

    一个一致的读取GET是块的一个读一致版本检索。该检索可以使用撤消数据。例如,如果未提交的事务已更新了块中的两行,并且如果在单独的会话中的查询请求了该块,则数据库将使用撤消数据来创建该块的读取一致版本(称为一致读取克隆)。不包括未提交的更新。通常,查询以一致模式检索块。

缓冲I / O(Buffer I/O

逻辑I / O,也被称为缓冲的I / O,指的是读取和在缓冲器中缓存的缓冲区写入。当在内存中找不到请求的缓冲区时,数据库将执行物理I / O将缓冲区从闪存缓存或磁盘复制到内存中,然后执行逻辑I / O读取缓存的缓冲区。

 

缓冲区写入

数据库写入(DBW)过程中定期写冷,脏缓冲区写入磁盘。在以下情况下,DBW n将写入缓冲区:

  • 服务器进程找不到用于将新块读入数据库缓冲区高速缓存的干净缓冲区。

    随着缓冲区被弄脏,可用缓冲区的数量减少。如果该数目降到内部阈值以下,并且需要清洁缓冲区,则服务器处理信号DBW n进行写入。

    数据库使用LRU确定要写入的脏缓冲区。当脏缓冲区到达LRU的冷端时,数据库会将它们从LRU移到写队列。DBW n将队列中的缓冲区写入磁盘,并尽可能使用多块写入。这种机制可以防止LRU的末端被脏缓冲区阻塞,并允许找到干净的缓冲区以供重用。

  • 数据库必须前进checkpoint,这是重做线程中必须从其开始实例恢复的位置。

  • 表空间更改为只读状态或脱机。

 

缓冲读取(Buffer Reads

当清除或未使用的缓冲区数量少时,数据库必须从缓冲区高速缓存中删除缓冲区。该算法取决于是否启用了闪存缓存:

  • 闪存缓存已禁用

    数据库将根据需要重新使用每个干净的缓冲区,并将其覆盖。如果以后需要覆盖的缓冲区,则数据库必须从磁盘读取它。

  • 启用了闪存缓存

    DBW n可以将干净缓冲区的主体写入闪存缓存,从而可以重用其内存中的缓冲区。数据库将缓冲区标头保存在主存储器的LRU列表中,以跟踪缓冲区主体在闪存高速缓存中的状态和位置。如果以后需要此缓冲区,则数据库可以从闪存缓存而不是从磁盘读取。

当客户端进程请求缓冲区时,服务器进程在缓冲区高速缓存中搜索缓冲区。一个高速缓存命中,如果数据库查找内存中的缓冲区发生。搜索顺序如下:

  1. 服务器进程在缓冲区高速缓存中搜索整个缓冲区。

    如果该进程找到了整个缓冲区,那么数据库将对该缓冲区执行逻辑读取

  2. 服务器进程在闪存LRU列表中搜索缓冲区头。

    如果该进程找到了缓冲区标头,则数据库将对缓冲区主体进行优化的物理读取。快闪缓存到内存中的缓存。

  3. 如果该进程在内存中找到缓冲区(高速缓存未命中),则服务器进程将执行以下步骤:

    1. 将块从数据文件复制到内存(物理读取

    2. 对读入内存的缓冲区执行逻辑读

下图说明了缓冲区搜索顺序。扩展缓冲区高速缓存既包括内存缓冲区高速缓存(包含整个缓冲区),也包括闪存高速缓存(包含缓冲区主体)。在图中,数据库在缓冲区高速缓存中搜索缓冲区,但未找到该缓冲区,而是将其从磁盘读入内存。

Oracle11g内存结构概述

通常,通过缓存命中访问数据比通过缓存未命中访问数据更快。该缓冲区高速缓存命中率措施的数据库是如何经常发现在缓冲区缓存请求块,而不需要从磁盘中读取它。

数据库可以从数据文件或临时文件执行物理读取。从数据文件读取后跟逻辑I / O。当内存不足迫使数据库将数据写入临时表并稍后再读回时,就会发生从临时文件的读取。这些物理读取会绕过缓冲区高速缓存,并且不会产生逻辑I / O。

 

缓冲区接触计数(Buffer Touch Counts

数据库使用触摸计数来测量LRU列表上缓冲区的访问频率。此机制使数据库可以在固定缓冲区时增加计数器的数量,而不是不断地对LRU列表上的缓冲区进行改组。

固定缓冲区后,数据库将确定上一次增加其触摸计数的时间。如果计数在三秒前增加,则计数增加;否则,计数增加。否则,计数保持不变。三秒钟的规则可防止缓冲区中的针脚数量激增。例如,一个会话可以在一个数据块中插入几行,但是数据库将这些插入视为一次接触。

如果缓冲区位于LRU的冷端,但是其触摸计数很高,则该缓冲区将移至热端。如果触摸计数较低,则缓冲区将耗尽缓存。

 

缓冲区和全表扫描(Buffers and Full Table Scans

当必须从磁盘读取缓冲区时,数据库会将缓冲区插入LRU列表的中间。 这样,热块可以保留在高速缓存中,因此无需再次从磁盘读取它们。

全表扫描带来了一个问题,该扫描顺序读取表高水位线以下的所有行。假设表段中块的总大小大于缓冲区高速缓存的大小。对该表进行全面扫描可以清除缓冲区高速缓存,从而阻止数据库维护频繁访问的块的高速缓存。

对大表进行全面扫描的结果是,将读取到数据库缓存中的块与其他类型的读取区别对待。这些块可立即重新使用,以防止扫描有效清除缓冲区高速缓存。

在不希望使用默认行为的极少数情况下,您可以更改表的属性。在这种情况下,数据库不会强制或固定缓冲区高速缓存中的块,而是以与其他任何块相同的方式将它们从高速缓存中老化。执行此选项时请格外小心,因为对大表的完整扫描可能会将大多数其他块从缓存中清除。

 

缓冲池(Buffer Pools

一个缓冲池是缓冲区的集合。数据库缓冲区高速缓存分为一个或多个缓冲池。

您可以手动配置单独的缓冲池,这些缓冲池可以在使用数据块后立即将数据保留在缓冲区高速缓存中或使缓冲区可用于新数据。然后,您可以将特定的架构对象分配给适当的缓冲池,以控制块在缓存中过期的方式。

可能的缓冲池如下:

  • 默认池

    该池是通常缓存块的位置。除非您手动配置单独的池,否则默认池是唯一的缓冲池。

  • 保持池

    该池适用于经常访问的块,但由于空间不足,这些块已过期。保留缓冲池的目的是将对象保留在内存中,从而避免I / O操作。

  • 回收池

    该池用于不经常使用的块。回收池可防止对象占用缓存中不必要的空间。

数据库具有标准块大小,您可以使用与标准大小不同的块大小来创建表空间。每个非默认块大小都有其自己的池。Oracle数据库以与默认池相同的方式管理这些池中的块。

下图显示了使用多个池时缓冲区高速缓存的结构。缓存包含默认池,保留池和回收池。默认块大小为8 KB。高速缓存包含用于表空间的单独池,这些池使用2 KB,4 KB和16 KB的非标准块大小。

Oracle11g内存结构概述

重做日志缓冲区(Redo Log Buffer

重做日志缓冲区是在SGA循环缓冲器,其存储重做描述到数据库所做的更改的条目。重做条目包含重建或重做DML或DDL操作对数据库所做的更改所必需的信息。数据库恢复将重做条目应用于数据文件以重建丢失的更改。

Oracle数据库流程 将重做条目从用户存储空间复制到SGA中的重做日志缓冲区。重做条目在缓冲区中占用连续的顺序空间。后台进程日志编写器(LGWR)将重做日志缓冲区写入磁盘上的活动在线重做日志组。下图显示了此重做缓冲区活动。

Oracle11g内存结构概述

LGWR将重做顺序写入磁盘,而DBW n将数据块分散地写入磁盘。分散写入往往比顺序写入要慢得多。因为LGWR使用户避免等待DBW n完成其慢速写入,所以数据库可提供更好的性能。

的初始化参数指定的存储器缓冲重做条目时Oracle数据库使用的量。与其他SGA组件不同,重做日志缓冲区和固定SGA缓冲区不会将内存分成颗粒。

 

来源:君子不怨天

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年11月1日
下一篇 2020年11月1日

相关推荐