从Oracle 9i 开始,Oracle 数据库就提供一种表的数据压缩特性。它可以显著地减少磁盘空间占用,并且在表的数据查询时也会减少该表内存读的量,该机制也会提升查询性能。
这种特性通常在数据仓库类应用中广泛使用。
(miki 西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1600337 )
Oracle 的压缩特性是在一个数据块中通过消除相同值而实现。一个数据块中任何重复出现的值会被同一个块中“ symbol table ” 的一个“symbol 向量” 代替。例如,在一个数据块中某行中一个列的值为“welcome stanford ” ,还有4 行中此列的值也是“welcome stanford ” ,在压缩以后,它该值只会存储一次,剩下的四次都会被一个“symbol 向量” 代替。“symbol 向量” 的字节数会远远比原来的值要小很多。
2 、表的压缩语法
alter table TABLE_MIKIXIYOU move compress;
这里压缩的表为TABLE_MIKIXIYOU 。
3 、表的压缩测试
首先记录下将要压缩的表的体积,为1408MB 。
SQL> select segment_name,(bytes/1024/1024) as mbb from user_segments_1 t where t.segment_name='CMS_DOC_SINGLE_ATTR';
SEGMENT_NAME MBB
------------- ----------
TABLE_MIKIXIYOU 1408
然后,执行压缩操作,注意压缩期间该表不能写。
alter table TABLE_MIKIXIYOUmove compress;
在压缩过程中会以TM 6 级锁表。
最后,压缩结束得到压缩结果为920MB 。
SQL> select segment_name,(bytes/1024/1024) as mbb from user_segments_1 t where t.segment_name='CMS_DOC_SINGLE_ATTR';
SEGMENT_NAME MBB
------------- ----------
TABLE_MIKIXIYOU 920
从结果看,压缩比率为65% ,是可以节省一定的空间的。
4 、总结
压缩特性在数据仓库环境中可以最优使用,尤其是对事实表而言。因为压缩在一个数据块中进行的,所以数据块的大小越大越好,数据仓库上数据块的设置通常也是比较大的。它还能提升查询性能,因为在同样记录数下数据块数变小了。
当然,压缩特性也可以应用在OLTP 应用类数据库上。但如果并发写入多的话,可能会出现严重的等待。