IM列存储压缩有多种选择,如下:
(1)NO MEMCOMPRESS:数据未压缩。
(2)MEMCOMPRESS FOR DML:此方法可实现最佳DML性能。此方法对IM列存储数据的压缩最少,但除外NO MEMCOMPRESS。
注意:CELLMEMORYExadata闪存缓存上的存储不支持此压缩方法。
(3)MEMCOMPRESS FOR QUERY LOW:此方法可获得最佳查询性能。
此方法将IM列存储数据压缩大于MEMCOMPRESS FOR DML小于压缩MEMCOMPRESS FOR QUERY HIGH。
当INMEMORY在CREATE或ALTERSQL语句中没有指定压缩方法的情况下指定子句时,或者在MEMCOMPRESS FOR QUERY没有包括LOW或的情况下指定了子句时,此方法为默认方法HIGH。
注意:?如果INMEMORY_FORCE初始化参数设置为BASE_LEVEL,则INMEMORY对象和列将自动使用QUERY LOW压缩。数据字典视图可能会继续显示预先存在的压缩设置,但是基本级别始终透明地压缩该QUERY LOW级别的对象和列。
(4)MEMCOMPRESS FOR QUERY HIGH:此方法可实现良好的查询性能,并节省空间。
此方法将IM列存储数据压缩大于MEMCOMPRESS FOR QUERY LOW小于压缩MEMCOMPRESS FOR CAPACITY LOW。
(5)MEMCOMPRESS FOR CAPACITY LOW:此方法在节省空间和查询性能之间取得了平衡,并倾向于节省空间。
此方法将IM列存储数据压缩大于MEMCOMPRESS FOR QUERY HIGH小于压缩MEMCOMPRESS FOR CAPACITY HIGH。此方法应用了一种称为Oracle Zip(OZIP)的专有压缩技术,该技术提供了专门针对Oracle Database进行了特别调优的超快速解压缩。必须先解压缩该数据,然后才能对其进行扫描。
当MEMCOMPRESS FOR CAPACITY指定时不包含LOW或时,此方法是默认方法HIGH。
(6)MEMCOMPRESS FOR CAPACITY HIGH:这种方法可以最大程度地节省空间。
此方法最大程度地压缩IM列存储数据。
实例验证
语法如下:
SQL> alter table test1 inmemory NO MEMCOMPRESS;
Table altered.
SQL> alter table test1 inmemory MEMCOMPRESS FOR QUERY LOW;
Table altered.
可以通过user_tables的INMEMORY_COMPRESSION查看压缩级别
SQL> alter table test1 inmemory NO MEMCOMPRESS;
Table altered.
SQL> select INMEMORY_COMPRESSION from user_tables where table_name='TEST1';
INMEMORY_COMPRESSION
---------------------------------------------------
NO MEMCOMPRESS
SQL> alter table test1 inmemory MEMCOMPRESS FOR QUERY LOW;
Table altered.
SQL> select INMEMORY_COMPRESSION from user_tables where table_name='TEST1';
INMEMORY_COMPRESSION
---------------------------------------------------
FOR QUERY LOW
也可以通过v$im_segments查压缩级别以及使用的内存大小
SQL> col SEGMENT_NAME for a5
SQL> col INMEMORY_COMPRESSION for a20
SQL> set linesize 200
SQL> select INST_ID,SEGMENT_NAME,INMEMORY_SIZE/1024/1024,BYTES/1024/1024,BYTES_NOT_POPULATED/1024/1024,INMEMORY_COMPRESSION from gv$im_segments;
no rows selected
SQL> select count(*) from test1;
COUNT(*)
----------
72573
SQL> select INST_ID,SEGMENT_NAME,INMEMORY_SIZE/1024/1024,BYTES/1024/1024,BYTES_NOT_POPULATED/1024/1024,INMEMORY_COMPRESSION from gv$im_segments;
INST_ID SEGME INMEMORY_SIZE/1024/1024 BYTES/1024/1024 BYTES_NOT_POPULATED/1024/1024 INMEMORY_COMPRESSION
---------- ----- ----------------------- --------------- ----------------------------- --------------------
1 TEST1 4.25 11.015625 0 FOR QUERY LOW
SQL> alter table test1 inmemory NO MEMCOMPRESS;
Table altered.
SQL> select count(*) from test1;
COUNT(*)
----------
72573
SQL> select INST_ID,SEGMENT_NAME,INMEMORY_SIZE/1024/1024,BYTES/1024/1024,BYTES_NOT_POPULATED/1024/1024,INMEMORY_COMPRESSION from gv$im_segments;
INST_ID SEGME INMEMORY_SIZE/1024/1024 BYTES/1024/1024 BYTES_NOT_POPULATED/1024/1024 INMEMORY_COMPRESSION
---------- ----- ----------------------- --------------- ----------------------------- --------------------
1 TEST1 10.25 11.015625 0 NO MEMCOMPRESS
可以看到FOR QUERY LOW是4.25MB,NO MEMCOMPRESS是10.25MB。