12C新特性:INMEMORY实战(3)IM列存储压缩方法

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。

Related Posts