[转载]Oracle数据库压缩探秘
转载自王建博客:http://blog.
前几天,我的一位朋友买了块1.5TB的硬盘。听说以后,我很感慨PC上用的单块硬盘能有这么大容量,因为我个人用过的第一台PC机长城0520才配了10MB硬盘,而十年前我接触过的最大的数据库系统也只有几百个GB。信息爆炸,加上存储技术的飞速发展,使得更多的信息被数字化地保存在硬盘及其他存储设备上。现在即使是几个TB的数据库也不值得炫耀了。
但是,即使当存储的每GB的单价已经变得很便宜了,我们还是需要使用压缩技术来提高存储效率。我的朋友买这块硬盘是用来存储高清电影的。每部高清电影大约需要20到30GB,但是这已经是压缩过的。很多高清电影的视频压缩比很高,可以达到100:1。这意味着,如果不压缩的话,一块1.5TB的硬盘可能只能放一部高清电影。
当然,视频压缩是允许有损失的,所以压缩比很高。如果压缩的是数据库的话,是不允许数据有任何损失的,所以压缩比会比这个低很多。Oracle数据库目前的压缩比能达到2:1到4:1,设想一下,如果一个数据库系统能节省一半的存储设备,能省下的钱还是很可观的。
数据库压缩带来的好处不只是节省存储空间和相应成本,同时还提高了I/O效率。因为数据库在读取数据的时候是读取压缩后的数据,所以大大节省了I/O的数量——例如,原来需要读2000个数据块,现在只需要读1000个。绝大部分情况下,减少I/O节省下来的时间要比在内存中解压缩数据所需的时间多,所以压缩可以提高读操作的性能。对于修改、插入和删除数据的操作,性能可能会略有下降,但是对于获得的好处来讲,还是很值得的。
数据库压缩的概念在Oracle9i第二版就已经引入,但是当时只对批量加载的数据,例如用SQL*Loader Direct load或者用Create table as select的,才能够压缩。但是对DML增删改操作的数据都不能压缩,所以大部分情况下并不是很实用。压缩功能的使用很简单,在创建表时加compress子句就可以。例如:
CREATE TABLE test (
a NUMBER
, b VARCHAR2(128)
, c VARCHAR2(256)
) COMPRESS;
在Oracle 11g中引入了Advanced Compression Option,使得对所有操作,包括DML都可以用压缩功能,新的语法如下:
CREATE TABLE test (
a NUMBER
, b VARCHAR2(128)
, c VARCHAR2(256)
) COMPRESS FOR ALL OPERATIONS;
为什么11g能做到对DML操作的数据也能压缩呢?秘密在于这种压缩方式是对数据块级的本地压缩,如下图所示
" border="0" />
在压缩这个数据块的数据时,先会在数据块的header部分创建了一个符号表(Symbol Table),里面会包含那些重复值,例如’John’, ‘Doe’等等,这些值都有相应的Symbol。然后把数据块中的那些重复值的数据都用相应的Symbol替代,达到压缩的效果。当新的数据被插入时,其中在Symbol Table中有对应值的数据都会被Symbol替代。
需要注意的是,在11g中,如果只加COMPRESS,那么缺省的是9i引入的那种只对批量加载有效的压缩,等同于COMPRESS FOR DIRECT_LOAD OPERATIONS .
如果想预计压缩的效果,可以在SQL*Plus中执行
SQL>execute dbms_compression.getratio(ownername=>'SCOTT',tabname=>'TEST',sampling_percent=>10);
这个工具会在指定表中取样(本例中是10%),得到预计的压缩率。
数据库压缩对应用程序来说是完全透明的,应用并不需要知道所操作的表有没有做过压缩。所有压缩、解压都是由Oracle自动完成的。所以即使是Oracle EBS, Siebel, Peoplesoft, SAP应用也都可以享受数据库压缩的好处。
Data Pump, RMAN也都能用到压缩,可以大大减少导数据或者备份的时间窗口。Active Data Guard也可以利用压缩功能减低对带宽的要求。
Oracle近期即将发布11g第二版,据说Advanced Compression Option还有更强大的压缩功能推出,包括针对数据仓库的更高压缩比的方式。看来数据库压缩的新功能还是很值得期待的。
关于Oracle 的11g有很多新资料现在可以在官网下载,还有官方提供的试用软件,大家可以多到那里看看:http://