天天看點

聊聊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   

          .

          ..

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;

SQL> grant create any table to comp_test;

SQL> grant select any dictionary to comp_test;

實驗資料表建立。

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> 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

SQL> exec dbms_comp_advisor.getratio('COMP_TEST','T',50);

Sampling percentage: 50%

Estimated compression ratio for the advanced compression option is : 2.77

SQL> exec dbms_comp_advisor.getratio('COMP_TEST','T',90);

Sampling percentage: 90%

Estimated compression ratio for the advanced compression option is : 2.8

Getratio方法的三個參數分别為object_owner,object_name和sample percentage。估算的結果是采用了壓縮技術之後壓縮率。那麼,實際壓縮比例是多少呢?

SQL> alter table t move compress;

Table altered

        MB

         2

       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提供了一種最小性能影響下的估算值。在實際工作中,還是很有意義的。