Oracle 12c DB In-Memory特性之加载数据到IM

一般默认情况下,Oracle在第一次访问对象之后才把此对象加载到IM中(如select count(*)from tab)。一般一个对象开启了IM,数据库会通过后台进程异步的从buffer cache和disk中加载需要的数据到IM中.

过程如下:

把表设置成INMEMORY

查询V$IM_SEGMENTS中的数据

从上边可以看到虽然表rita.tb设置了IM相关属性,但是由于没有加载,在V$IM_SEGMENTS中找不到与之对应的数据的。

通过读取rita.tb表来加载。

这5个进程是用于加载数据到IM的后台进程。

从表V$IM_SEGMENTS可以看到对rita.tb表的加载已经完成,及使用

表存储到IM中之后的大小。

使用PRIORITY来加载数据

通过设置PRIORITY对象在数据库open后,操作DDL或者DML后,对象就会IM中。PRIORITY有5个级别,分别是:NONE、LOW、MEDIUM、HIGH、CRITICAL。只有在高级别被加载到IM之后,级别低才会开始加载到IM。

PRIORITY的默认值为none,代表着如果队形没有被扫描则不会被主动加载到IM中。

测试如下:

使用下面的语句查看这两张表的加载顺序:

SELECTa.OBJECT_NAME,

b.INMEMORY_PRIORITY,

b.POPULATE_STATUS,

TO_CHAR(c.CREATETIME,'yyyy/mm/ddHH24:MI:SS')START_POP,

TO_CHAR(MAX(d.TIMESTAMP),'yyyy/mm/ddHH24:MI:SS')FINISH_POP

FROMDBA_OBJECTS a,

V$IM_SEGMENTS b,

V$IM_SEGMENTS_DETAIL c,

V$IM_HEADER d

WHEREOBJECT_NAMEIN('TB','TAB_INM')

ANDa.OBJECT_NAME =b.SEGMENT_NAME

ANDa.OBJECT_TYPE ='TABLE'

ANDa.OBJECT_ID = c.BASEOBJ

ANDc.DATAOBJ = d.OBJD

GROUPBYa.OBJECT_NAME,

b.INMEMORY_PRIORITY,

b.POPULATE_STATUS,

c.CREATETIME

ORDERBYFINISH_POP;

说明:

在RAC环境中,每个节点拥有自己的IM Area。如果一个对象因为数据量太大无法被加载到一个IM Area中,还可以通过设置DISTRIBUT将它分成几个数据片分别加载到不同的节点中。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180727G1FSCU00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券