一般默认情况下,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将它分成几个数据片分别加载到不同的节点中。
领取专属 10元无门槛券
私享最新 技术干货