聊聊Compression Advisor
对任何系统管理员和数据库管理员来说,存储空间是一个永恒的话题。不断下降的存储单价永远赶不上系统数据指数级别的爆炸增长。如何在有限的空间中存入更多的数据,是每一个DBMS都关注的问题。
数据压缩(Data Compression)是Oracle从早期版本开始就提供支持的一个feature。截止至11g版本,Data Compression应该说还不是非常成熟,只是在结构化数据中提供数据块级别重复数据的压缩。直到Advanced Compression组件的正式推出,Oracle才实现了全方面的数据压缩解决方案,包括对结构化数据(Table)、非结构化数据(Lob)、Backup Set和Network(Redo Transfer)的压缩支持。
在任何数据库和版本中,数据压缩都不是“万灵药”。压缩算法要在数据存取过程中,消耗额外的CPU资源进行处理。所以,即使是Oracle,也只是在最近才提出对于OLTP的操作压缩支持。作为运维人员乃至前期应用开发人员,都需要在空间和时间之间做出平衡、估算和选择。
在早期的版本中,Oracle提供了一些工具,来实现对数据表压缩的估算。本篇介绍一个应用于9i到11.1版本范围内的工具Compress Advisor。
1、资源下载
Compress Advisor并不是默认安装的组件,需要我们手工从Oracle官方网站上独立下载,具体网址为:
下载后是一个zip格式的文件,名称为compress-advisor.zip,解压之后就是安装文件和说明文件。
C:\Users\51ibm\Desktop\AD\compression-advisor>dir
驱动器 C 中的卷没有标签。
卷的序列号是 360A-018F
C:\Users\51ibm\Desktop\AD\compression-advisor 的目录
2013/02/16 21:54
.
2013/02/16 21:54
..
2011/11/11 11:47 964 dbmscomp.sql
2011/04/22 15:09 2,084 prvtcomp.plb
2011/04/22 15:19 1,477 readme.txt
3 个文件 4,525 字节
2 个目录 59,655,270,400 可用字节
2、实验环境准备
Compress Advisor工具的使用版本是9i到11.1,我们选择10g进行实验。
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 – Production
实验用户和数据表创建。
SQL> create user comp_test identified by comp_test;
User created
SQL> grant connect, resource to comp_test;
Grant succeeded
SQL> grant create public synonym to comp_test;
Grant succeeded
SQL> grant create any table to comp_test;
Grant succeeded
SQL> grant select any dictionary to comp_test;
Grant succeeded
实验数据表创建。
SQL> conn comp_test/comp_test@ora10gasm
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as comp_test
SQL> create table t as select * from dba_objects order by owner;
Table created
SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true);
PL/SQL procedure successfully completed
此时,我们关注一下段segment分配情况。
SQL> select bytes/1024/1024 MB from dba_segments where wner='COMP_TEST' and segment_name='T';
MB
----------
6
SQL> select blocks, blocks*8/1024 MB from dba_tables where wner='COMP_TEST' and table_name='T';
BLOCKS MB
---------- ----------
704 5.5
在没有进行压缩处理的时候,T数据表大小为6M。同时,高水位线下有704个数据块,合计5.5M。
3、安装Compress Advisor组件
下面需要将组件安装上。依次执行解压文件中的包即可。
C:\Users\51ibm\Desktop\AD\compression-advisor>sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on 星期六 2月 16 22:14:53 2013
Copyright (c) 1982, 2010, Oracle. All rights reserved.
SQL> conn sys/oracle@ora10gasm as sysdba
已连接。
SQL> @dbmscomp.sql
程序包已创建。
同义词已创建。
授权成功。
没有错误。
SQL> @prvtcomp.plb
程序包体已创建。
同义词已创建。
授权成功。
没有错误。
SQL>
4、使用预测和效果
从 10g开始,Oracle引入了一系列的自动化和建议工具(advisor),并且将二者结合起来,目标是形成数据库自我诊断、自我管理、自我优化的体系结构。Compress Advisor其实就是一个手工执行的工具组件。其功能就是分析一个特定数据表的数据分布情况,估算一下如果进行压缩操作,效果如何。
在执行脚本之后,我们引入了一个新的数据库包dbms_comp_advisor,可以使用其中的方法getratio来进行估算。
SQL> conn comp_test/comp_test@ora10gasm
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as comp_test
SQL> set serveroutput on;
SQL> exec dbms_comp_advisor.getratio('COMP_TEST','T',10);
Sampling table: COMP_TEST.T
Sampling percentage: 10%
Estimated compression ratio for the advanced compression option is : 2.78
PL/SQL procedure successfully completed
SQL> exec dbms_comp_advisor.getratio('COMP_TEST','T',50);
Sampling table: COMP_TEST.T
Sampling percentage: 50%
Estimated compression ratio for the advanced compression option is : 2.77
PL/SQL procedure successfully completed
SQL> exec dbms_comp_advisor.getratio('COMP_TEST','T',90);
Sampling table: COMP_TEST.T
Sampling percentage: 90%
Estimated compression ratio for the advanced compression option is : 2.8
PL/SQL procedure successfully completed
Getratio方法的三个参数分别为object_owner,object_name和sample percentage。估算的结果是采用了压缩技术之后压缩率。那么,实际压缩比例是多少呢?
SQL> alter table t move compress;
Table altered
SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true);
PL/SQL procedure successfully completed
SQL> select bytes/1024/1024 MB from dba_segments where wner='COMP_TEST' and segment_name='T';
MB
----------
2
SQL> select blocks, blocks*8/1024 MB from dba_tables where wner='COMP_TEST' and table_name='T';
BLOCKS MB
---------- ----------
255 1.9921875
压缩之后,大小约为2M。
5、结论和讨论
我们说,类似于第三方程序的compress advisor的生命周期尽现到11.1版本。到11.2之后,Oracle三个自动作业(Segment Space Advisor、Statistical Data、SQL Tuning Advisor)中的segment advisor已经将Compress Advisor的功能融合到其中。
对数据表压缩的选取,笔者有一些自己的想法。我们面对的绝大多数系统,无论是OLTP特性还是OLAP特性,数据库中的数据活跃性(Active)都不会是一致的。有些数据,如在线交易数据、新进入系统的订单数据,操作频繁,变化剧烈。但是一旦经过活跃生命周期,活跃性就急剧下降。比如,订单完成配送、评价之后,交易票证运算开账之后。我们说,这样的数据活跃性其实是有差异的。
对于OLAP系统也是如此。当数据被新加载/析取到系统中去,作为基础数据/事实表的一部分之后,大都会进行复杂的抽取过程,抽取成中间结果。经过这个处理之后,数据被直接访问的几率也就大大降低了。
所以说,一个健康、考虑长远的系统,一定对数据有生命周期分析,将数据按照生命阶段进行分表和分库操作,最终让数据有一个圆满的“归宿”(归档)。
结合到压缩技术,我们一定要看到压缩对于DML操作的影响!如果存在压缩数据的必要性,一定要从最不活跃的数据表选起,逐步的进行尝试。
最后我们说一下compress advisor和之后的segment advisor的意义。笔者认为压缩的估算意义还是在于应对生产环境。在生产环境下,数据表可能会很大,而且很可能是7×24小时访问。Compress Advisor提供了一种最小性能影响下的估算值。在实际工作中,还是很有意义的。