Oracle DB管理内存

• 描述SGA 中的内存组件
• 实施自动内存管理
• 手动配置SGA 参数
• 配置自动PGA 内存管理
 
 
  • 内存管理:概览
DBA 必须将内存管理视为其工作中至关重要的部分,因为:
• 可用内存空间量有限
• 为某些类型的功能分配更多内存可提高整体性能
• 自动优化的内存分配通常是正确的配置,但特定环境甚至短期情况下可能需要特别注意
 
由于数据库服务器上的可用内存量有限,因此,对于Oracle DB 实例,必须注意内存的分配情况。如果将过多的内存分配给没有此需求的特定区域使用,则很可能导致其它功能区没有足够的内存,无法以最优方式工作。采用自动确定和维护内存分配的功能,极大地简化了该项任务。但是,要实现系统内存最佳利用,即使是自动优化的内存也需要进行监控,有时可能还需要某种程度的手动配置。
 
  • 复查Oracle DB 内存结构
 
复查Oracle DB 内存结构
Oracle DB 创建并使用内存结构来满足多种用途。例如,内存可以存储正在运行的程序代码、用户间共享的数据以及每个已连接的用户的专用数据区域。
一个实例有两个关联的基本内存结构:
• 系统全局区(SGA) :一组共享的内存结构(称为 SGA 组件),其中包含一个 Oracle DB 实例的数据和控制信息。SGA 在所有服务器和后台进程之间共享。SGA 中存储的数据的示例包括高速缓存的数据块和共享SQL 区域。
• 程序全局区(PGA) :包含服务器进程或后台进程的数据及控制信息的内存区域。PGA 是Oracle DB 在服务器进程或后台进程启动时创建的非共享内存。服务器进程对PGA 的访问是独占的。每个服务器进程和后台进程都具有自己的PGA 。
 
SGA 是包含实例的数据和控制信息的内存区。SGA 包含以下数据结构:
• 共享池:用于缓存可在用户间共享的各种构造
• 数据库缓冲区高速缓存:用于缓存从数据库中检索到的数据块
• 保留缓冲池:一种经过优化的专用数据库缓冲区高速缓存,用于长时间在内存中保留数据块
• 回收缓冲池:一种经过优化的专用数据库缓冲区高速缓存,用于从内存中快速回收或删除数据块
• nK  缓冲区高速缓存:几种专用数据库缓冲区高速缓存之一,用于存放与默认数据库块大小不同的块大小
• 重做日志缓冲区:用来缓存用于恢复实例的重做信息,直到可以将其写入磁盘中存储的物理重做日志文件
• 大型池:可选区域,用于为某些大型进程(如 Oracle  备份和恢复操作)和I/O  服务器进程分配较大的内存空间
• Java 池:用于存储Java 虚拟机(JVM)  中特定会话的所有 Java 代码和数据.
• 流池:Oracle Streams 使用它来存储捕获和应用所需的信息.
使用Oracle Enterprise Manager 或SQL*Plus 启动实例时,会显示为SGA 分配的内存量。
 
程序全局区(PGA)  是一个内存区,其中包含每个服务器进程的数据及控制信息。Oracle Server  进程为客户机请求提供服务。每个服务器进程都有在服务器进程启动时创建的自己专用的PGA 。PGA 只能由相应的服务器进程访问,并且只有代表该服务器进程的 Oracle 代码可对其进行读取和写入。 PGA 分为两个主要区域:堆栈空间和用户全局区(UGA) 。
使用动态SGA 基础结构,可以在不关闭实例的情况下更改数据库缓冲区高速缓存、共享池、大型池、Java 池和流池的大小。
Oracle DB 使用初始化参数来创建和管理内存结构。管理内存的最简单方法是允许数据库自动管理和优化内存。在大多数平台上,要实现此目的, 只需设置目标内存大小初始化 参数( MEMORY_TARGET )  和最大内存大小初始化参数( MEMORY_MAX_TARGET) 。
 
  • 缓冲区高速缓存
缓冲区高速缓存
通过指定 DB_CACHE_SIZE 参数的值,可以配置缓冲区高速缓存。缓冲区高速缓存可存放数据文件中块大小为DB_BLOCK_SIZE 的数据块的副本。缓冲区高速缓存是SGA 的一部分,因此所有用户都可以共享这些块。服务器进程将数据文件中的数据读入缓冲区高速缓存。为了提高性能,服务器进程有时在一个读操作中会读取多个块。然后由DBW n 进程将数据从缓冲区高速缓存写入数据文件。为提高性能,DBW n 在一个写操作中会写入多个块。
 
在任何给定时间,缓冲区高速缓存都可能会存放一个数据库块的多个副本。虽然该块只存在一个当前副本,但为了满足查询需要,服务器进程可能需要根据过去的映像信息构造读一致性副本。这称为读一致性(CR) 块。
 
最近最少使用(LRU)  列表可反映缓冲区的使用情况。缓冲区将依据其被引用时间的远近和引用频率进行排序。因此,最经常使用且最常用的缓冲区将列在最近最常使用一端。传入的块先被复制到最近最少使用一端的缓冲区中,然后该缓冲区将被指定到列表中央,作为起点。从这个起点开始,缓冲区根据使用情况在列表中上下移动。
 
缓冲区高速缓存中的缓冲区可以处于以下四种状态之一:
• 已连接:当前正将该块读入高速缓存或正在写入该块。其它会话正等待访问该块。
• 干净的:该缓冲区目前未连接,如果其当前内容(数据块)将不再被引用,则可以立即执行过期处理。这些内容与磁盘保持同步,或者缓冲区包含块的读一致性快照。
• 空闲/未使用:缓冲区因实例刚启动而处于空白状态。此状态与“干净”状态非常相似,不同之处在于缓冲区未曾使用过。
• 脏:缓冲区不再处于连接状态,但内容(数据块)已更改,因此必须先通过 DBW n 将内容刷新到磁盘,然后才能执行过期处理。
 
服务器进程使用缓冲区高速缓存中的缓冲区;而DBW n 进程通过将更改的缓冲区写回数据文件,使高速缓存中的缓冲区变为可用状态。
检查点队列中列出将要写出到磁盘的缓冲区。
 
Oracle DB 支持同一数据库中有多种块大小。 标准块大小用于SYSTEM 表空间。标准块大小可以通过设置初始化参数DB_BLOCK_SIZE 来指定。其有效值介于2 KB 到32 KB  之间,默认值为8 KB。非标准块大小的缓冲区的高速缓存大小通过以下参数指定:
• DB_2K_CACHE_SIZE
• DB_4K_CACHE_SIZE
• DB_8K_CACHE_SIZE
• DB_16K_CACHE_SIZE
• DB_32K_CACHE_SIZE
DB_ n K_CACHE_SIZE参数不能用于调整标准块大小的高速缓存的大小。如果DB_BLOCK_SIZE 的值为n K,则设置DB_ n K_CACHE_SIZE是非法的。标准块大小的高
速缓存的大小始终由DB_CACHE_SIZE 的值确定。
 
由于每个缓冲区高速缓存的大小都有限制,因此,通常并非磁盘上的所有数据都能放在高速缓存中。当高速缓存写满时,后续高速缓存未命中会导致Oracle DB 将高速缓存中已有的灰数据写入磁盘,以便为新数据腾出空间。(如果缓冲区中没有灰数据,则不需要写入磁盘即可将新块读入该缓冲区。)以后若对已写入磁盘的任何数据进行访问,则会导致再次出现高速缓存未命中现象。
 
数据请求导致高速缓存命中的几率会受到高速缓存大小的影响。高速缓存越大,包含所请求数据的几率也就越大。因此,增加高速缓存大小会提高引起高速缓存命中的数据请求的百分比。
 
  • 使用多个缓冲池
 
数据库管理员(DBA) 可以创建多个缓冲池来提高数据库缓冲区高速缓存的性能。你可以根据对象的访问情况将其分配给某个缓冲池。
 
缓冲池有三种:
• 保留:此池用于保留内存中可能要重用的对象。将这些对象保留在内存中可减少 I/O操作。通过使池的大小大于分配给该池的各个段的总大小,可以将缓冲区保留在此池中。这意味着缓冲区不必执行过期处理。保留池可通过指定DB_KEEP_CACHE_SIZE参数的值来配置。
 
• 回收:此池用于内存中重用几率很小的块。回收池的大小要小于分配给该池的各个段的总大小。这意味着读入该池的块经常需要在缓冲区内执行过期处理。回收池可通过指定DB_RECYCLE_CACHE_SIZE 参数的值来配置。
 
• 默认:此池始终存在。它相当于没有保留池和回收池的实例的缓冲区高速缓存,可通过DB_CACHE_SIZE 参数进行配置。
注:保留池或回收池中的内存不是默认缓冲池的子集。
 
CREATE INDEX cust_idx …
STORAGE (BUFFER _POOL KEEP);
 
ALTER TABLE oe.customers
STORAGE (BUFFER_POOL RECYCLE);
 
ALTER INDEX oe.cust_lname_ix
STORAGE (BUFFER _POOL KEEP);
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值