五、强制全数据库缓存模式

  Oracle数据库实例可以在缓冲区缓存中缓存整个数据库。
注意此特性从Oracle Database 12c Release 1(12.1.0.2)开始可用。

1.强制全数据库缓存模式简介

  在默认的缓存模式下,当用户查询一个大表时,Oracle数据库并不总是缓存底层数据,因为这样做可能会从缓冲区缓存中删除更多有用的数据。从Oracle Database 12c Release 1(12.1.0.2)开始,如果Oracle数据库实例确定有足够的空间将整个数据库缓存到缓冲区缓存中,并且这样做是有益的,那么实例将自动将整个数据库缓存到缓冲区缓存中。
  在缓冲区缓存中缓存整个数据库可能会提高性能。可以使用ALTER database force FULL database CACHING语句强制实例将数据库缓存到缓冲区缓存中。该语句将实例置于强制全数据库缓存模式。在这种模式下,Oracle数据库假定缓冲区缓存足够大,可以缓存整个数据库,并尝试缓存后续访问的所有块。
  当Oracle数据库实例处于强制全数据库缓存模式时,下面的查询返回YES:

SYS@orcl> select force_full_db_caching from v$database;

FOR
---
NO

  当实例处于默认缓存模式时,NOCACHE lob不会缓存到缓冲区缓存中。但是,当实例处于强制全数据库缓存模式时,NOCACHE lob可以缓存在缓冲区缓存中。而且,使用SecureFiles LOB存储的LOB和使用BasicFiles LOB存储的LOB都只能在强制全数据库缓存模式下缓存在缓冲区缓存中。

注意

  • 将实例置于强制全数据库缓存模式时,数据库对象不会立即加载到缓冲区缓存中。相反,当它们被访问时,它们才被缓存在缓冲区缓存中。
  • 在多租户环境中,强制全数据库缓存模式应用于整个多租户容器数据库(CDB),包括其所有可插入数据库(pdb)。
  • 关于强制全数据库缓存模式的信息存储在控制文件中。如果替换或重新创建了控制文件,则会丢失关于强制全数据库缓存模式的信息。恢复的控件文件可能包含此信息,也可能不包含此信息,这取决于控件文件的备份时间。

2.在启用强制全数据库缓存模式之前

  数据库必须具有12.0.0或更高的兼容性级别,才能为数据库实例启用强制全数据库缓存模式。此外,确保缓冲区缓存足够大,可以缓存整个数据库。
  当将数据库配置为使用SGA_TARGET或MEMORY_TARGET初始化参数进行自动内存管理时,缓冲区缓存的大小可能会根据工作负载而变化。
运行以下查询来估算实例在正常工作负载下的缓冲区缓存大小:

SYS@orcl> select name,bytes/(1024*1024) from v$sgainfo where name='Buffer Cache Size';

NAME				 BYTES/(1024*1024)
-------------------------------- -----------------
Buffer Cache Size			       544

  该查询返回所有可能块大小的缓冲区缓存大小。如果数据库使用多种块大小,那么最好确保每个可能块大小的缓冲区缓存大小大于该块大小的数据库总大小。

  可以通过DB_nK_CACHE_SIZE初始化参数确定非默认块大小的缓冲区缓存大小。对于SGA_TARGET或MEMORY_TARGET,默认池中默认块大小的缓冲区缓存大小可能会根据工作负载而变化。下面的查询返回默认池中默认块大小的当前缓冲区缓存大小:

SYS@orcl> select component,current_size/(1024*1024) from v$sga_dynamic_components where component='DEFAULT buffer cache';

COMPONENT							 CURRENT_SIZE/(1024*1024)
---------------------------------------------------------------- ------------------------
DEFAULT buffer cache								      508

SYS@orcl> show parameter db_cache_size;

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_cache_size			     big integer 508M

  如果您正在估计在缓冲区缓存中完全运行数据库所需的内存,那么您可以根据以下方法之一估计缓冲区缓存的大小:

  • 如果计划使用SGA_TARGET,那么可以估计缓冲区缓存大小为SGA_TARGET的60%
  • 如果计划使用MEMORY_TARGET,则可以估计SGA大小为MEMORY_TARGET的60%,缓冲区缓存大小为SGA大小的60%。也就是说,可以估计缓冲区缓存大小为MEMORY_TARGET的36%。

3.启用与禁用强制全数据库缓存模式

# 1.使用具有ALTER DATABASE系统特权的用户连接到实例
sqlplus / as sysdba

# 2.启动数据库到挂载状态
SYS@orcl> startup mount;

# 3.发出以下SQL语句,启动强制全数据库缓存
alter database force full database caching;

# 4.打开数据库
alter database open;

# 5.禁用强制全数据库缓存模式,在mount状态下执行如下语句:
alter database no force full database caching;

六、数据库智能Flash缓存

  数据库智能Flash缓存特性是使用固态设备(SSD)技术的数据库缓冲区缓存的透明扩展。数据库智能Flash缓存可以大大提高Oracle数据库的性能,它可以减少磁盘I/O的数量,而且成本比增加等量的RAM低得多。

1.何时配置数据库智能Flash缓存

  当以下所有条件都为真时,可以考虑添加数据库智能Flash缓存:

  • 您的数据库运行在Solaris或Oracle Linux操作系统上。数据库智能Flash缓存只支持这些操作系统。
  • 自动工作负载存储库(AWR)报告或STATSPACK报告的缓冲池咨询部分指出,将缓冲区缓存的大小增加一倍是有益的。
  • db file sequential read是一个top等待事件
  • 你有备用CPU

注意不能在多个实例之间共享一个flash文件。但是,如果使用逻辑卷管理器或类似的工具对flash设备进行静态分区,则可以在多个实例之间共享单个flash设备。

2.设置数据库智能Flash缓存的大小

  作为一般规则,数据库智能Flash缓存的大小应介于缓冲区缓存的2倍至10倍之间。
  任何低于2的乘数都不会带来任何好处。如果您正在使用自动共享内存管理,请将Database Smart Flash Cache的大小设置为SGA_TARGET的2倍到10倍之间。使用SGA_TARGET大小的80%而不是完整大小也足以进行此计算。

3.调整数据库智能Flash缓存的内存

  对于从缓冲区缓存移动到数据库智能Flash缓存的每个数据库块,缓冲区缓存中保留了少量关于该块的元数据。
  对于单个实例数据库,元数据大约消耗100个字节。对于Oracle Real Application Clusters (Oracle RAC)数据库,它更接近200字节。因此,在添加数据库智能Flash缓存时,必须考虑到这个额外的内存需求。

要调整数据库智能Flash缓存的内存,请完成以下操作之一:

  • 如果您手动管理内存,那么将缓冲区缓存的大小增加大约等于数据库智能Flash缓存中数据库块的数量乘以100(对于Oracle RAC或200)。
  • 如果您正在使用自动内存管理,那么使用上面描述的算法增加MEMORY_TARGET初始化参数的大小。您可能首先必须增加MEMORY_MAX_TARGET初始化参数的大小。
  • 如果您正在使用自动共享内存管理,那么请增大SGA_TARGET初始化参数的大小。

  另外,对于使用闪存缓存的Oracle RAC数据库,必须为共享池分配额外的内存,用于Global Cache Service (GCS)资源。每个GCS资源在共享池中大约需要208个字节。

说明:您可以通过发出ALTER SYSTEM flush FLASH_CACHE语句来刷新数据库智能Flash缓存。如果需要度量重写查询或从相同起点开始的一组查询的性能,或者缓存中可能存在损坏,那么刷新数据库智能Flash缓存将非常有用。

4.数据库智能Flash缓存初始化参数

Parameter

Description

DB_FLASH_CACHE_FILE

在操作系统文件系统或Oracle Automatic Storage Management磁盘组中,为要包含Database Smart Flash Cache的文件指定路径和文件名列表。如果指定的文件不存在,则数据库将在启动期间创建它。每个文件必须驻留在闪存设备上。如果在磁盘驱动器(主轴)上配置数据库智能闪存缓存,则性能可能会受到影响。最多支持16个文件。

DB_FLASH_CACHE_SIZE

指定数据库智能Flash缓存中每个文件的大小。每个大小对应于DB_FLASH_CACHE_FILE中指定的文件。文件和大小按照指定的顺序对应。如果指定大小的数量与指定文件的数量不匹配,则会引发错误。每个大小规格必须小于或等于其闪存设备的物理内存大小。大小用nG表示,表示千兆字节(GB)。例如,指定16GB的Database Smart Flash Cache,将“DB_FLASH_CACHE_SIZE”的值设置为16G。

例如,假设您的数据库智能Flash缓存使用以下Flash设备:

File

Size

/dev/sda

32G

/dev/sdb

32G

/dev/sdc

64G

你可以像下面一样设置初始化参数:

DB_FLASH_CACHE_FILE = /dev/sda, /dev/sdb, /dev/sdc

DB_FLASH_CACHE_SIZE = 32G, 32G, 64G

  通过查询V$FLASHFILESTAT视图,可以确定每个文件的累计时延和读取次数,并计算平均时延。
  您可以使用ALTER SYSTEM将DB_FLASH_CACHE_SIZE设置为零,用于您希望禁用的每个闪存设备。您还可以使用ALTER SYSTEM将任何被禁用的flash设备的大小设置回其原始大小,以便重新启用它。但不支持动态更改数据库智能Flash缓存的大小。

  Oracle建议您在Oracle Real Application Clusters环境中,要么给所有实例都配置Database Smart Flash Cache,要么都不配置。另外,在每个实例上配置的总闪存缓存大小应该大致相同。

七、使用Oracle Database In-Memory 提高查询性能

  Oracle内存数据库(Database In-Memory, Oracle Database In-Memory)是在Oracle Database 12c Release 1(12.1.0.2)中首次引入的一套功能,它极大地提高了实时分析和混合工作负载的性能。

Database In-Memory特性可以大大提高执行以下操作的查询的性能:

  • 扫描大量行并应用使用<、>、=和IN等操作符的过滤器
  • 从表或者是有大量列的物化视图中选择少量的列,比如从100列访问5列的查询
  • 使用SQL操作符选择LOB列
  • 将小维度表与大事实表连接起来
  • 分类汇总

  Database In-Memory特性集包括In-Memory Column Store (IM column store)、高级查询优化和可用性解决方案。
(1)In-Memory Column Store
  IM列存储是Database In-Memory的关键特性。IM列存储以一种特殊的压缩列格式维护表、分区和单个列的副本,这种格式为快速扫描进行了优化。IM列存储驻留在In-Memory区域中,它是系统全局区域(SGA)的可选部分。
  IM列存储并不取代基于行的存储或数据库缓冲区缓存,而是对其进行补充。数据库支持以基于行和列的格式在内存中存储数据,提供了两种格式的最佳选择。IM列存储提供了独立于磁盘格式的表数据的附加事务一致性副本。

(2)高级查询优化
Database In-Memory包括对分析查询的几个性能优化:

  • In-Memory Expression (IM expression):在IM列存储中识别和增添热表达式
  • Join Group: 允许消除解压和哈希列值的性能开销。
  • In-Memory Aggregation (IM aggregation): 增强连接小维表和大事实表的聚合查询的性能。
  • Repopulation:通过用修改过的对象自动重新填充IM列存储来增强查询性能。
  • In-Memory Dynamic Scans (IM dynamic scans):当CPU资源空闲时,自动使用轻量级线程进行并行表扫描,从而提高查询性能。

(3)支持高可用性
Database In-Memory包含以下可用性特性:

  • 当数据库实例重新启动时,减少将数据填充到IM列存储中的时间。这个功能是通过 In-Memory FastStart (IM FastStart)特性实现的。
  • 在Oracle RAC环境中为每个节点提供IM列存储。
  • 在Active Data Guard环境中为备用数据库提供IM列存储。

注意默认情况下,Oracle数据库的“Oracle Database in - memory”功能是关闭的。可以通过将INMEMORY_SIZE初始化参数设置为大于0的值来启用它。当Oracle Database In-Memory启用时,Oracle数据库资源管理器(资源管理器–Resource Manager,Oracle Database Resource Manager)也会自动启用。

八、使用Memoptimized Rowstore启用高性能数据流

  Memoptimized Rowstore为应用程序提供了高性能数据流,例如物联网(IoT,Internet of Things)应用程序,这些应用程序通常从大量客户端以单行插入的方式同时传输少量数据,并以非常高的频率为客户端查询数据。

Memoptimized Rowstore提供了以下功能:

  • 快速摄取
    快速摄取优化了高频的向数据库中插入单行数据的处理。快速摄取使用大池缓冲插入,然后再写入磁盘,以提高数据插入性能。
  • 快速查找
    快速查找能够从数据库中快速检索高频查询的数据。快速查找使用SGA中一个叫做memoptimize池的独立内存区域来缓冲从表中查询的数据,从而提高查询性能。

注意为了使用快速查找,必须使用MEMOPTIMIZE_POOL_SIZE初始化参数为memoptimization池分配适当的内存大小。

九、内存管理参考

  仅部分平台支持自动内存管理。此外,您还可以查询一组数据字典视图,以获得有关内存管理的信息。

1.支持自动内存管理的平台

以下平台支持自动内存管理——Oracle数据库能够自动调优SGA和PGA的大小,根据需要将内存从一个重新分配到另一个,以优化性能:

  • Linux
  • Solaris
  • Windows
  • HP-UX
  • AIX

2.内存管理相关的数据字典视图

一组动态性能视图提供关于内存管理的信息:

View

Description

V$SGA

显示系统全局区域的摘要信息(SGA)

V$SGAINFO

显示SGA的大小信息,包括SGA不同组件的大小、颗粒大小和空闲内存。

V$SGASTAT

显示关于在共享池、大池、Java池和流池中内存分配情况的详细信息。

V$PGASTAT

显示PGA内存使用统计信息,以及启用自动PGA内存管理器时(即设置PGA_AGGREGATE_TARGET时)的相关统计信息。V$PGASTAT中的累积值是自实例启动以来累积的。

V$MEMORY_DYNAMIC_COMPONENTS

显示关于所有自动调整和静态内存组件的当前大小的信息,以及每个组件上发生的最后一个操作(例如,增长或收缩)。

V$SGA_DYNAMIC_COMPONENTS

显示所有SGA组件的当前大小,以及每个组件的最后一次操作。

V$SGA_DYNAMIC_FREE_MEMORY

显示有关用于未来动态SGA调整大小操作的可用SGA内存量的信息。

V$MEMORY_CURRENT_RESIZE_OPS

显示有关当前正在进行的调整大小操作的信息。调整大小操作是对SGA、实例PGA或动态SGA组件的放大或缩小。

V$SGA_CURRENT_RESIZE_OPS

显示有关当前正在进行的动态SGA组件调整大小操作的信息。

V$MEMORY_RESIZE_OPS

显示关于最近800个完成的内存组件调整大小操作的信息,包括SGA_TARGET和PGA_AGGREGATE_TARGET的自动增长和收缩操作。

V$SGA_RESIZE_OPS

显示有关最近800个完成的SGA组件调整大小操作的信息。

V$MEMORY_TARGET_ADVICE

如果启用了自动内存管理,则显示帮助您调优MEMORY_TARGET的信息。

V$SGA_TARGET_ADVICE

显示帮助您调优SGA_TARGET的信息。

V$PGA_TARGET_ADVICE

显示帮助您调优PGA_AGGREGATE_TARGET的信息。

V$IM_SEGMENTS

显示为IM列存储中所有段分配的存储信息。注意:此视图从Oracle Database 12c Release 1(12.1.0.2)开始可用。