【COMPRESS】11g中表压缩技术的长足进步

曾经在《【表压缩】使用表压缩技术将表所占用空间降低到最小》(http://space.itpub.net/519536/viewspace-621766)这篇文章中谈到了10g中有关表压缩的一些知识。此文将给大家介绍一下11g在表压缩领域的长足发展。

Oracle在11g之前版本中的压缩技术应用场景非常的有限,多用于只读的数据库仓库中,要求表中的数据是只读的。因此在OLTP的环境中很少见到数据压缩技术的身影。
11g推出的数据压缩技术已经打破了这个束缚,Oracle通过只存储在保存压缩元数据的特定表(符号表,symbol table)中有重复的列值的单个副本,消除了块中所有重复的值。得益于此项技术,访问压缩数据时的I/O也大大减少,进而,压缩技术延展到了OLTP领域。

通过实验,简单窥探一下此技术的使用方法。

1.确认操作系统版本
sys@secooler> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

2.创建大约128M的测试用普通表T
sec@secooler> create table t as select * from all_objects;

Table created.

sec@secooler> insert into t select * from t;

71327 rows created.

sec@secooler> /

142654 rows created.

sec@secooler> /

285308 rows created.

sec@secooler> commit;

Commit complete.

sec@secooler> insert into t select * from t;

570616 rows created.

sec@secooler> commit;

Commit complete.

sec@secooler> select segment_name,bytes/1024/1024 MB from user_segments;

SEGMENT_NAME                           MB
------------------------------ ----------
T                                     128

3.使用“compress for all operations”选项创建压缩表
sec@secooler> create table T_COM_FOR_ALL_OPERATIONS compress for all operations as select * from T;

Table created.

4.普通表与压缩表占用空间大小比较
sec@secooler> select segment_name,bytes/1024/1024 MB from user_segments;

SEGMENT_NAME                           MB
------------------------------ ----------
T                                     128
T_COM_FOR_ALL_OPERATIONS               44

可见,几乎节省了2/3的存储空间,现在的大小(44M)是原先大小(128M)的1/3!
的确是一个非常大的压缩比例。Oracle号称可以达到“3.5:1”的压缩比。

5.尝试更新操作,看一下更新的效率
sec@secooler> set timing on
sec@secooler> update t set object_id=1;

1141232 rows updated.

Elapsed: 00:00:58.59
sec@secooler> update t_com_for_all_operations set object_id=1;

1141232 rows updated.

Elapsed: 00:00:47.61
sec@secooler> select segment_name,bytes/1024/1024 MB from user_segments;

SEGMENT_NAME                           MB
------------------------------ ----------
T                                     128
T_COM_FOR_ALL_OPERATIONS               45

Elapsed: 00:00:00.70

因为操作的数据集合较小,所以数据的总体更新时间有所下降。

6.Oracle 11R2中关于compress参数语法定义
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_7002.htm#i2095331
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/img_text/table_compression.htm

{ COMPRESS [ FOR { ALL | DIRECT_LOAD } OPERATIONS ]
| NOCOMPRESS
}

7.小结
因为11g中提供的压缩技术可以直接读取压缩数据而无需解压缩数据块,因此在OLTP环境下使用这样的压缩技术基本上没有性能上的损失。
技术永远向前发展,赞。


Good luck.

secooler
10.05.05

-- The End --

请使用浏览器的分享功能分享到微信等