曾经在《【表压缩】使用表压缩技术将表所占用空间降低到最小》(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 --