首页 > 技术文章 > 聊聊Compression Advisor

ataoxz 2021-07-26 09:33 原文

对任何系统管理员和数据库管理员来说,存储空间是一个永恒的话题。不断下降的存储单价永远赶不上系统数据指数级别的爆炸增长。如何在有限的空间中存入更多的数据,是每一个DBMS都关注的问题。

 

 

数据压缩(Data Compression)是Oracle从早期版本开始就提供支持的一个feature。截止至11g版本,Data Compression应该说还不是非常成熟,只是在结构化数据中提供数据块级别重复数据的压缩。直到Advanced Compression组件的正式推出,Oracle才实现了全方面的数据压缩解决方案,包括对结构化数据(Table)、非结构化数据(Lob)、Backup SetNetworkRedo Transfer)的压缩支持。

 

在任何数据库和版本中,数据压缩都不是“万灵药”。压缩算法要在数据存取过程中,消耗额外的CPU资源进行处理。所以,即使是Oracle,也只是在最近才提出对于OLTP的操作压缩支持。作为运维人员乃至前期应用开发人员,都需要在空间和时间之间做出平衡、估算和选择。

 

在早期的版本中,Oracle提供了一些工具,来实现对数据表压缩的估算。本篇介绍一个应用于9i11.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工具的使用版本是9i11.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_ownerobject_namesample 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 AdvisorStatistical DataSQL Tuning Advisor)中的segment advisor已经将Compress Advisor的功能融合到其中。

 

对数据表压缩的选取,笔者有一些自己的想法。我们面对的绝大多数系统,无论是OLTP特性还是OLAP特性,数据库中的数据活跃性(Active)都不会是一致的。有些数据,如在线交易数据、新进入系统的订单数据,操作频繁,变化剧烈。但是一旦经过活跃生命周期,活跃性就急剧下降。比如,订单完成配送、评价之后,交易票证运算开账之后。我们说,这样的数据活跃性其实是有差异的。

 

对于OLAP系统也是如此。当数据被新加载/析取到系统中去,作为基础数据/事实表的一部分之后,大都会进行复杂的抽取过程,抽取成中间结果。经过这个处理之后,数据被直接访问的几率也就大大降低了。

 

所以说,一个健康、考虑长远的系统,一定对数据有生命周期分析,将数据按照生命阶段进行分表和分库操作,最终让数据有一个圆满的“归宿”(归档)。

 

结合到压缩技术,我们一定要看到压缩对于DML操作的影响!如果存在压缩数据的必要性,一定要从最不活跃的数据表选起,逐步的进行尝试。

 

最后我们说一下compress advisor和之后的segment advisor的意义。笔者认为压缩的估算意义还是在于应对生产环境。在生产环境下,数据表可能会很大,而且很可能是7×24小时访问。Compress Advisor提供了一种最小性能影响下的估算值。在实际工作中,还是很有意义的。

推荐阅读