Bootstrap

Oracle Database 21c新特性:In-Memory增强

Oracle Database In-Memory技术在12c版本当中就已经向大家提供,这是一种“鱼和熊掌可以兼得”的技术。随着数据库版本不断地升级,In-Memory技术也不断发展。在Oracle Database 21c当中,又为大家带来不少惊喜,接下来我们就通过实验一同了解一下在Oracle Database 21c当中有哪些In-Memory的技术增强吧。

Automatic In-Memory

启用Automatic In-Memory技术,无需用户干预即可实现数据填充、删除和重新压缩段。当INMEMORY_AUTOMATIC_LEVEL设置为HIGH时,数据库会根据段的使用模式自动启用和填充段。结合对选择性列级回收和重新压缩的支持,In-Memory的数据填充在很大程度上实现自我管理。这种自动化有助于最大限度地增加一次可以填充到In-Memory列存储中的对象数量。

图片

Automatic In-Memory将在SQL工作负载发生变化时,自动对内存中的数据进行优化,无需人为干预。工作数据集由最频繁查询的段组成。通常,对于许多应用程序,工作数据集随时间而变化。用户必须决定哪些段使用In-Memory技术,往往需要通过监控来决定数据段的载入与删除,并创建ADO IM策略。这需要数据库管理员对工作量有一个全面的了解。

为了将DBA从人工维护的工作中解放出来,Automatic In-Memory使用频繁更新的内部统计信息来维护IM列存储中的工作数据集。Oracle数据库决定加载何种数据,清除何种数据,以及何时执行。从某种意义上说,IM列存储实现了“自动驾驶”。

当初始化参数INMEMORY_AUTOMATIC_LEVEL设置为HIGH时,Automatic In-Memory会持续监视IM存储中的列统计信息,并将所有预先没有INMEMORY属性的段设置为INMEMORY MEMCOMPRESS AUTO。数据库只加载它决定属于工作数据集中的对象。该决定基于当前使用统计信息。数据库通过内部列统计来识别IM存储的非活动区域,这与Heat Map使用的相似,但不需要将HEAT_MAP设置为ON。Automatic In-Memory可以重新压缩 AUTO segments中的非活动数据,以节省空间。优先级设置为非NONE的段将被排除在自动清除算法之外。

接下来,我们通过一个例子来了解Automatic In-Memory是如何工作的,看看它如何将数据自动加载到IM列存储,并将非活动数据从其中清除。

测试分析

首先我们通过下面的语句,来查询当前数据库的内存配置情况,然后将INMEMORY_AUTOMATIC_LEVEL设定为LOW(没有启动自动IM管理),之后在HR用户下面创建一个表,叫做emp,然后插入一些数据,并将它放入内存当中。

图片

 

图片

图片

接下来,我们查看刚才创建的emp表的IM属性,并修改HR.JOB_HISTORY的IM属性,将它放入IM并启动压缩。

图片

现在我们启动自动IM管理,只需将INMEMORY_AUTOMATIC_LEVEL设定为HIGH即可。这个操作要在容器数据库上执行,设定之后,重启数据库使其生效。

图片

然后我们检查HR下面的表的IM状态。

图片

如果看不到上面红框所示的默认enabled并且设定为auto状态,那么只要在PDB级别通过下方语句设定一下,并重启PDB即可。

图片

通过观察上面HR下各个表的IM状态,我们发现COUNTRIES表的状态是disabled,为什么没有和其他表一样,一起修改过来呢?我们通过下面的语句,强制修改它的IM属性看看。

图片

通过提示可以看到,In-Memory不支持IOT表,而COUNTRIES就是一个IOT表。

接下来我们对HR下的表进行全表扫描。

图片

为什么只有emp表的数据被载入内存当中,而其他表的数据没有被载入?这有两方面原因:首先是系统根据统计值来决定哪些表应该放入内存,因为统计值不是实时更新的,刚做完数据查询,统计值还没有更新,所以还没有将该表信息载入IM存储当中。其次,统计值已经是最新的,但系统认为该数据是冷数据,不应该被放入IM存储。

图片

CellMemory级别的Aotu In-Memory

目前,Exadata单元上的CellMemory要求RDBMS端inmemory_size为> 0。这是因为CellMemory需要In-Memory选件。对于自治数据库和运行EE极端性能的Oracle云,inmemory_size则不需要设定。这在Bug 26797490中已经完成。现在,我们希望引入INMEMORY_FORCE=cellmemory_level,以允许本地客户在不设置inmemory_size的情况下使用CellMemory。

In-Memory对外部表的增强

对于分区的或混合的外部表,INMEMORY子句在表和分区级都受到支持。对于混合表,表级INMEMORY属性适用于所有分区,无论是内部的还是外部的。这种增强极大地扩展了对内存中的外部表的支持。

In-Memory软件许可问题

我们知道In-Memory是Oracle数据库企业版的选件,现在Oracle为了让我们的客户都能享受到使用In-Memory所带来的性能提升,在某种程度上,我们将In-Memory作为数据库的基本特性提供给大家,如果您已经使用Oracle企业版数据库,并且In-Memory列存储的设定不超过16GB,您将无需支付In-Memory选件的版权费。对于免版权费的部分,使用上有如下限制:

1. AIM禁止

2. 压缩级只能是QUERY LOW

3. 不能排除列

4. CELL MEMORY禁止(Exadata特性)

图片

In-Memory混合扫描

当一个表中,并非所有列都被放入In-Memory列存储中,这时候Oracle数据库同样支持In-Memory扫描。这种情况发生在,出于节省空间为目的,将某些列设定为NO INMEMORY,In-Memory混合扫描可以同时从列存储和行存储中读取数据,这与之前完全从行存储读取数据,性能提升几个数量级。

 

在Oracle数据库21c之前,如果查询引用任何带有NO INMEMORY属性的列,那么该查询将访问行存储(buffer cache)中的所有数据。因此,表扫描不能使用列格式、谓词下推和其他In-Memory特性。从Oracle Database 21c开始,带有INMEMORY和NO INMEMORY列的查询都可以访问列存储数据。在某些情况下,IM混合扫描可以将性能提高几个数量级。当查询具有选择性过滤器时,性能将得到最大的提高。在这种情况下,IM列存储可以快速过滤掉大部分行,以便行存储只投射到少量行。为了实现最优性能,优化器会比较不同的访问方法。如果优化器选择了表扫描,那么存储引擎将自动确定IM混合扫描的性能是否优于常规行存储扫描。当满足以下条件时,优化器会考虑混合扫描:

  • 谓词只包含INMEMORY列。

  • 选择列表包含INMEMORY和NO INMEMORY的任意组合

IM混合扫描在逻辑上将工作分为两部分:一部分处理对IM列存储的查询,另一部分处理对行存储的查询。在执行计划中,TABLE ACCESS INMEMORY FULL (HYBRID)操作表示混合扫描。请注意,如果运行时统计信息表明只访问行存储会提高性能,那么数据库可以在运行时禁用IM混合扫描。

;