Oracle Database 20c:In-Memory混合扫描_Java

在Oracle Database 20c之前,在使用In-Memroy技术的时候,如果在查询当中涉及到某个字段被设定了NO INMEMORY属性,那么将会读取整行记录,表扫描技术没能将列存储的特性发挥到极致。从Oracle Database 20c开始,字段被设定为INMEMORY或者NO INMEMORY都将可以使用In-Memory的快速扫描技术。在某些情况下,使用混合In-Memory技术可以将性能提升几个数量级,尤其是当一个查询带有where条件进行过滤的时候,这将得到更大的性能提升。在这种情况下,IM列存储可以快速过滤掉大多数行,这样行存储就需要映射少量的行就可以了。为了获得最佳性能,优化器会比较不同的访问方法。如果优化器选择表扫描,那么存储引擎将自动确定混合IM扫描是否比常规行存储扫描执行得更好。当有如下情况发生时,优化器考虑混合扫描:

  • 当查询语句的过滤谓词中,只包含被标记为INMEMORY的字段。

  • 在SELECT列表当中包含被设定为INMEMORY或NO INMEMORY字段的任意组合

比如下方的例子,我们创建了一个表hr.emp,然后在表的级别上设定INMEMORY属性,然后将里面的FIRST_NAME字段设定为NO INMEMORY。

Oracle Database 20c:In-Memory混合扫描_Java_02

但如果在where条件中出现了非INMEMORY字段,比如下方的FIRST_NAME,那么在执行计划里面将不会看到In-Memory混合扫描。

Oracle Database 20c:In-Memory混合扫描_Java_03

接下来,我们做一个查询,在SELECT的字段列表上,出现被设定为IN MEMROY的字段,也出现被设定为NO INMEMORY的字段,如果在Database 20c之前,这将读取整行数据,没有将In-Memory列存储的性能发挥到极致,我们看看下面的查询,里面使用了被标记为INMEMORY和NO INMEMORY的字段组合,我们看看它的执行计划。通过观察发现,在执行计划当中看到了In-Memory混合列扫描的使用,如下图中红色框所标记。

Oracle Database 20c:In-Memory混合扫描_Java_04

下面的例子也是一样,满足where条件中涉及的字段都是INMEMORY的,而SELECT列表中可以是一个函数或者其他字段的任意组合,这都会使用混合In-Memory扫描技术。

Oracle Database 20c:In-Memory混合扫描_Java_05

关于In-Memory混合扫描,我们就介绍到这里。在上面的操作中,涉及到了字段级别的INMEMORY和NO INMEMORY的设定,我们在这里就复习一下相关的内容。这些内容不是新的,而是在Oracle Database 12.2的时候就已经提供给大家了。

在Oracle Database 12.2的时候,我们可以为一个没有开启INMEMORY设定的表,在字段级别上使用INMEMORY子句。在之前的版本,只有在设定了INMEMORY的表或者分区上可以使用字段级别的INMEMORY子句,这就意味着在表或者分区设定INMEMORY属性之前,不能在字段级别上设定INMEMORY属性。从12.2开始,可以在表或者分区没有设定INMEMORY属性之前,在字段级别上设定INMEMORY属性,只不过不生效罢了,直到表或者分区上启动了INMEMORY功能。如果用户通过语句明确设定这个表或者分区为NO INMEMORY,那么这个表相关字段级别上的In-Memory设定都将被删除。

我们下面就通过例子为大家说明。

1、首先创建一个普通的分区表,包含3个字段,c1、c2和c3,以及3个分区,并且明确指出不启动NO INMEMORY属性。Oracle Database 20c:In-Memory混合扫描_Java_06


2、接下来我们看看当前这张表是否在字段级别上有In-Memory设定

通过观察下方的查询结果,没有找到In-Memory相关设定。

Oracle Database 20c:In-Memory混合扫描_Java_07

3、接下来针对c3这个字段设定NO INMEMORY

指定这个表中的特定字段为NO INMEMORY

Oracle Database 20c:In-Memory混合扫描_Java_08

4、还是执行第2步的查询语句

在上面第2步的时候,查询结果为空,现在我们针对这张表的某个字段设定了NO INMEMORY属性之后,那么执行上面同样的查询就可以查到结果了。Oracle Database 20c:In-Memory混合扫描_Java_09

5、接下来我们对P3这个分区启动INMEMORY属性

因为之前设定了c3这个字段NO INMEMORY,所以在P3这个分区的In-Memory操作中,不会考虑c3字段。

Oracle Database 20c:In-Memory混合扫描_Java_10

6、接下来启动表级别的INMEMORY属性并设定字段上的In-Memory压缩属性


Oracle Database 20c:In-Memory混合扫描_Java_11Oracle Database 20c:In-Memory混合扫描_Java_12

然后通过动态性能视图,查询字段级别上的设定。通过下图发现,字段级别的属性都已经设定完毕。

Oracle Database 20c:In-Memory混合扫描_Java_13

7、如果在表级别设定了NO INMEMORY那么在字段级别的In-Memory相关设定都将被取消。

Oracle Database 20c:In-Memory混合扫描_Java_14

今天的内容就到这里,期待您继续关注我们的公众号,祝您周末愉快!

Oracle Database 20c:In-Memory混合扫描_Java_15

相关文章:

官宣:Oracle Database 20c(预览版)云端上线

Oracle Database 20c:区块链表

Oracle Database 20c: In-Memory增强

Oracle Database 20c: JSON功能增强

Oracle Database 20c与DATA SAFE