DBIM ( DatabaseIn-Memory ) 是Oracle12c数据库的选项,类似于RAC,ADG。
DBIM 能够实现对混合类型应用的支持,传统的以行形式保存的数据满足OLTP应用,列形式保存的数据满足以查询为主的OLAP应用。IM组件可以和其他数据库组件功能使用像Sybase IQ, SAP HANA,并不需要用户单独开发或者修改应用程序,就可以非常方便的实现基于实时数据库分析的转变
主要目的是利用内存的速度和优化的列格式来加速分析
DBIM 的缺省的参数有:
inmemory_size big integer 0
默认是不开启的。
DBIM 在内存中需要预留空间,属于SGA中的静态池分,是纯列式存储。列存储不会取代缓冲区缓存,而是作为一种补充,以便数据现在可同时以行格式和列格式存储在内存中。
通过INMEMORY_SIZE控制DBIM内存的大小,至少为100M,当其大于0时,启用DBIM功能。
开启步骤如下:
alter system set inmemory_size=200M scope=spfile sid='*' ;
重启数据库
数据库启动时,可以看到 SGA 中分配的 Inmemory Area 区域。
建一张测试表:
create table tab_inmas select * from dba_objects;
将该表数据设置存储在内存中
SQL> alter table tab_inm inmemory;
Table altered.
SQL> SET AUTOTRACE on
inmemory
执行计划如下:
V$INMEMORY_AREA
可以查询内存区域的使用情况,其中
USED_BYTES
表明当前已经使用的内存
:
从上边的执行计划看, 使用 in-memory 效果还是比较明显的。
In-Memory 需要注意如下及不支持:
1 、索引组织表 (IOT) 和集群表
2 、 LONG 何 out-of-line LOB 也不支持
12.2 之前不支持在 ADG 的 standby 实例中使用
另外,需要注意如下 2 点: (1) 该特性不支持 SYS 用户下的对象 , 不支持 SYSTEM 、 SYSAUX 表空间下的对象 (2)Objects that are smaller than 64KB are not populated into memory 如果要支持 sys 用户和 sys 表空间里面的对象,需要修改隐含参数 _inmemory_enable_sys 为 TRUE
(3) 强烈建议将每个 RAC 节点的 IM 列存储设置为相同大小。
(4) 热表、热分区、经常访问的列放入 In-Memory
