(二)加载数据到IM column store
在实验手册(一)中介绍了IM的基础操作,objects如何开启IM column store。
链接:http://blog.csdn.net/badly9/article/details/49746825
虽然在之前的操作中我们对objects开启了IM column store,但是这些objects仍然没有被加载到IM column store中。默认情况下,Oracle会自主决定什么时候将表加载如IM中。或者我们可以通过执行DBMS_INMEMORY包来手动加载objects到IM中。
通过设置sub-clause PRIORITY可以自动加载objects到IM中。
2.1 通过查询objects来加载数据到IM
默认情况下,Oracle在第一次访问objects之后加载该objects到IM中(比如全表扫描)。如果一个object开启了IM并且被查询之后,而且如果查询需要的数据并没有被加载到IM,数据库会通过后台进程异步的从buffer cache和disk中加载需要的数据到IM中,在数据逐步加载到IM中之后,之后的查询就会可以使用IM。
IM通过后台一组worker processes加载数据。每个worker process负责加载该objects的一部分。加载使用的是流机制,同时负责将数据的分列和压缩。在这个过程中,数据库正常运行。
就如一个表空间在硬盘上被分为多个extent,IM也被分成多个In-Memory Compression Units(IMCUs)。每个worker process会被分配自己的IMCU,加载objects的子集到IMCU中。数据在被加载到IMCU的过程中不会进行任何的分类和排序。加载数据的顺序和数据行实际存储的顺序相同。IMCU的大小和数量由系统内部算法决定。
通过视图V$IM_SEGMENTS和V$IM_USER_SEGMENTS能够查看objects是否被加载到IM中以及加载状态。如果segment仅仅设置了IM相关属性而没有被加载,则在这两个视图中并不会有与该segment对应的数据。
实验过程如下:
1.将sales表开启IM
SQL> ALTER TABLE SALES INMEMORY;
Table altered.
2.查询数据字典来确认表是否开启IM
SQL> SELECT INMEMORY, INMEMORY_PRIORITY, INMEMORY_COMPRESSION,
2 INMEMORY_DISTRIBUTE, INMEMORY_DUPLICATE
3 FROM USER_TABLES
4 WHERE TABLE_NAME = 'SALES';
INMEMORY INMEMORY INMEMORY_COMPRESS INMEMORY_DISTRI INMEMORY_DUPL
-------- -------- ----------------- --------------- -------------
ENABLED NONE FOR QUERY LOW AUTO NO DUPLICATE
3.查看