转 https://blog.csdn.net/stevensxiao/article/details/51437274
参考文献
https://www.zhihu.com/question/19883454
https://blog.csdn.net/zhangzheng0413/article/details/8271322/
Database In-Memory是Oracle数据库的选项,类似于RAC,ADG,发布于12.0.1.2。
它的主要目的是利用内存的速度和优化的列格式来加速分析。以下我们用DBIM或IM作为Database In-Memory的缩写。
Oracle Database In-Memory 选件
行格式与列格式
传统的数据库概念中,行式数据库适合于OLTP的DML操作,如Oracle, Mysql;而列式数据库适合于分析,如Sybase IQ, SAP HANA。
而在一个混合负载的环境中,就会面临两难的选择。
DBIM在Oracle传统的行式存储之外提供了内存中的列式存储,然后自动的为用户访问选择后端的行式或列式存储,从而解决了此难题。
换句话说,在磁盘上只有一份数据,而在内存中则存在行式的Cache和列式的IM内存数据。
新的IM存储不会增加双倍的内存需求,首先因为我们无需将所有的列式数据都载入内容,其次内存中列式数据可以压缩,而且由于重复值较多,压缩的比率也较高。
增加了DBIM,通常内存需求会增加20%,具体可以使用In-Memory Advisor计算。
虽然列式数据适合于只读的情形,但并不意味数据不可修改,数据修改后,DBIM自动维护数据的一致性,自动在后台刷新列式存储,这一切对于应用都是透明的。
再次强调,列式数据不是Cache,因此也就没有Cache中Aging的概念。加载时需要将指定列的所有行数据加载,而不能选择某些行。
内存中列存储
DBIM在内存中需要预留空间,属于SGA中的静态池分,是纯列式存储。列存储不会取代缓冲区缓存,而是作为一种补充,以便数据现在可同时以行格式和列格式存储在内存中。
通过INMEMORY_SIZE控制DBIM内存的大小,至少为100M,当其大于0时,启用DBIM功能。
作为静态池,对 INMEMORY_SIZE 参数所做的任何更改在重启数据库实例后才会生效。
内存中区域可分为两个池:一个 1MB 池,用于存储填充到内存中的实际列格式数据,称为In Memory Compression Units
(IMCUs);一个 64K 池,用于存储填充到 IM 列存储的对象的元数据以及交易的状态, 称为 Snapshot Metadata
Units (SMUs)。当数据被修改是,SCU可以记录哪些列式数据是过期的,需要修改。
填充内存中列存储
填充内存中列存储又称为populate。DBIM为表和物化视图添加了一个新的 INMEMORY 属性,具有 INMEMORY 属性的对象可以加载到 IM 列存储。
可以在表空间、表、(子)分区或物化视图上指定 INMEMORY 属性。可以通过排除法的方式选择部分列和部分分区,但不能选择部分行。
ALTER TABLESPACE ts_data INMEMORY; -- 所有表空间中的表
ALTER TABLE sales INMEMORY; -- 表的所有列
ALTER TABLE sales INMEMORY NO INMEMORY(prod_id); -- 表的所有列,除去prod_id