(In-Memory Option) IMO列式存储是12.1.0.2版本出现的新特性,IMO 是 SGA的一块可选区域,用来存储表、分区表和其他数据库对象的拷贝。
1. 存储格式:
内存列式存储,数据以列方式存储而不是行存储。
下图展示了IMO下数据存储格式与传统磁盘、缓存数据存储格式的区别。Products、customers、sales三张表在磁盘、缓存中都以行方式存储中,IMO以列方式存储。
2. 启用IMO
启用IMO非常简单
12.1.0.2 版本下,设置INMEMORY_SIZE 为非0值便可启用IM column store特性。
INMEMORY_SIZE 是个实例级参数,默认为0,设置一个非0值时,最小值为100M。
通常情况下,sys用户下的对象及SYSTEM、SYSAUX表空间上的对象无法使用IMO特性,但通过设置“_enable_imc_sys”隐含参数也可以使用
其他相关参数
INMEMORY_FORCE 启用或禁用表、物化视图的IMO存储
INMEMORY_CLAUSE_DEFAULT 设置为INMEMORY后,新建的表、物化视图等会启用IMO存储
INMEMORY_QUERY 启用或禁用内存查询
INMEMORY_MAX_POPULATE_SERVERS IMO的进程数量
INMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENT 设置能够用到的IMO进程的百分比
OPTIMIZER_INMEMORY_AWARE 设置优化器是否考虑IMO
3. 使用说明
IM column store 可以在以下几种对象级别使用:
列、表(字段级别)、物化视图(字段级别)、表空间、分区。
比较适用的场景
(1). 查询操作扫描大量的行,并使用操作符进行数据过滤,操作符诸如:=、<、>、
IN等;
(2). 查询操作选择少量的列,而查询对象表或物化视图中包含了大量的列,比如:某
个表包含100个列,而仅查询其中5个列;
(3). 查询操作进行小表与大表的连接;
(4). 查询要求进行数据聚合操作。
使用方法
执行以下DDL时带上INMEMORY子句
· CREATE TABLE
· ALTER TABLE
· CREATE TABLESPACE
· ALTER TABLESPACE
· CREATE MATERIALIZED VIEW
· ALTER MATERIALIZED VIEW
查看当前IMO存储的使用情况
SELECT OWNER, SEGMENT_NAME, INMEMORY_PRIORITY, INMEMORY_COMPRESSION FROM V$IM_SEGMENTS;
以下情况没有性能提升
(1). 进行复杂谓词的查询;
(2). 查询操作选择大量的数据列;
(3). 查询返回大量的数据行;
(4). 查询要求进行大表复杂的连接。
IM Column Store 压缩方法
NO MEMCOMPRESS数据无压缩(但是做了列式存储后,较行式存储仍有一定压缩量。)
MEMCOMPRESS FOR DML最小级别的压缩,有利于DML操作的性能优化。
MEMCOMPRESS FOR QUERY LOW最优化查询性能(缺省值)
MEMCOMPRESS FOR QUERY HIGH查询性能优化,同时获得更大空间压缩比。
MEMCOMPRESS FOR CAPACITY LOW获得更大的空间压缩量。
MEMCOMPRESS FOR CAPACITY HIGH最优化空间节省,活动最大的压缩比。
IMO存储对象的优先级
PRIORITY NONE 对象的查询将触发IM 列存储,该级别为缺省值,当IM对象被第一次扫描时,如果空间足够,触发该对象的加载。
PRIORITY LOW 级别高于PRIORITY NONE,低于PRIORITY MEDIUM,PRIORITY HIGH,PRIORITY CRITICAL ,CRITICAL、HIGH、MEDIUM级别对象加载完成后,如果空间足够,自动加载该级
别对象。
PRIORITY MEDIUM 级别高于PRIORITY NONE,PRIORITY LOW,低于PRIORITY HIGH,PRIORITY CRITICAL ,CRITICAL、HIGH级别对象加载完成后,如果空间足够,自动加载该级别对象。
PRIORITY HIGH级别高于PRIORITY NONE,PRIORITY LOW,PRIORITY MEDIUM,低于PRIORITY CRITICAL ,CRITICAL级别对象加载完成后,如果空间足够,自动加载该级别对象。
PRIORITY CRITICAL 优先级别最高 ,数据库打开的时候,IM对象就自动加载。
数据泵与IMO列式存储
Impdp导入数据库对象的时候,可以加上TRANSFORM=INMEMORY:y选项,这样对象原来IMO方式存储特性依然可以保持。如果设置 TRANSFORM=INMEMORY:n,导入对象的IMO特性将被忽略。
也可以设置TRANSFORM=INMEMORY_CLAUSE:string 改变对象的IMO属性。比如压缩级别。
SELECT SEGMENT_NAME,
INMEMORY_PRIORITY,
ROUND(BYTES / 1024, 2) SEG_SIZE_KB,--磁盘中段大小
ROUND(INMEMORY_SIZE / 1024, 2) INMEM_SIZE_KB,--IMO方式大小
ROUND(BYTES_NOT_POPULATED / 1024, 2) PROGRESS_SIZE_KB,--没有进入IMO的段大小
INMEMORY_COMPRESSION INMEMORY_COMP,--压缩级别
POPULATE_STATUS,
ROUND(ROUND(BYTES / 1024, 2) / ROUND(INMEMORY_SIZE / 1024, 2), 2) "压缩比"
FROM V$IM_SEGMENTS
ORDER BY SEGMENT_NAME;
可以看到压缩比在1.28到11.56之间,FOR CAPACITY HIGH 压缩比最高。
5. IMO方式性能简单测试
可以看到COST 由 426下降到27,提升约16倍!物理读为0
好了,Oracle 12c IMO新特性就介绍到这里,相信IM Column store能给数据库设计、优化带来不一样的体验!
--BY JWL
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30109892/viewspace-2091302/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30109892/viewspace-2091302/