對任何系統管理者和資料庫管理者來說,存儲空間是一個永恒的話題。不斷下降的存儲單價永遠趕不上系統資料指數級别的爆炸增長。如何在有限的空間中存入更多的資料,是每一個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提供了一種最小性能影響下的估算值。在實際工作中,還是很有意義的。