程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle壓縮功能小結2—預估表壓縮的效果

Oracle壓縮功能小結2—預估表壓縮的效果

編輯:Oracle教程

在使用壓縮之前,我們可以估算一下使用壓縮能夠擁有多大的效果。

11gr2以前可以使用dbms_comp_advisor,具體代碼已經在附件中給出。只需要執行兩個文件dbmscomp.sql和prvtcomp.plb,然後使用DBMS_COMP_ADVISOR.getratio存儲過程即可。不再詳細描述。

SQL> set serveroutput on
SQL> execdbms_comp_advisor.getratio('SH','SALES',10)
Sampling table: SH.SALES
Sampling percentage: 10%
Estimated compression ratio for the advancedcompression option is : 2.96

11gr2以後系統會自帶一個dbms_compression的包,用來代替dbms_comp_advisor提供服務。

_sys@FAKE> desc dbms_compression
PROCEDURE GET_COMPRESSION_RATIO
 ArgumentName                  Type                    In/Out Default?
 ----------------------------------------------------- ------ --------
 SCRATCHTBSNAME                 VARCHAR2                IN
 OWNNAME                        VARCHAR2                IN
 TABNAME                        VARCHAR2                IN
 PARTNAME                       VARCHAR2                IN
 COMPTYPE                       NUMBER                  IN
 BLKCNT_CMP                     BINARY_INTEGER          OUT
 BLKCNT_UNCMP                   BINARY_INTEGER          OUT
 ROW_CMP                        BINARY_INTEGER          OUT
 ROW_UNCMP                      BINARY_INTEGER          OUT
 CMP_RATIO                      NUMBER                  OUT
 COMPTYPE_STR                   VARCHAR2                OUT
 SUBSET_NUMROWS                 NUMBER                  IN     DEFAULT
FUNCTION GET_COMPRESSION_TYPE RETURNS NUMBER
 ArgumentName                  Type                    In/Out Default?
 ----------------------------------------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 TABNAME                        VARCHAR2                IN
 ROW_ID                         ROWID                   IN
PROCEDURE INCREMENTAL_COMPRESS
 ArgumentName                  Type                    In/Out Default?
 ----------------------------------------------------- ------ --------
 OWNNAME                        VARCHAR2(30)            IN
 TABNAME                        VARCHAR2(128)           IN
 PARTNAME                       VARCHAR2(30)            IN
 COLNAME                        VARCHAR2                IN
 DUMP_ON                        NUMBER                  IN     DEFAULT
 AUTOCOMPRESS_ON                NUMBER                  IN     DEFAULT
 WHERE_CLAUSE                   VARCHAR2                IN     DEFAULT
 

重點看GET_COMPRESSION_RATIO這個存儲過程,它可以預估表的壓縮比例。
可以使用以下的匿名塊執行。

DECLARE
 blkcnt_comp PLS_INTEGER;
 blkcnt_uncm PLS_INTEGER;
 row_comp    PLS_INTEGER;
 row_uncm    PLS_INTEGER;
 comp_ratio  number;
 comp_type   VARCHAR2(30);
 username varchar2(30) := '&USER';
 tablename varchar2(30) := '&TB' ;
BEGIN
 dbms_compression.get_compression_ratio('&Usedtbs',
                                         username,
                                        tablename,
                                         NULL,
                                        dbms_compression.COMP_FOR_OLTP,
                                        blkcnt_comp,
                                         blkcnt_uncm,
                                        row_comp,
                                        row_uncm,
                                        comp_ratio,
                                        comp_type);
 dbms_output.put_line('Sampling table: '||username||'.'||tablename);
 dbms_output.put_line('Estimated compression ratio: ' ||TO_CHAR(comp_ratio));
 dbms_output.put_line('Compression Type: ' || comp_type);
END;
/

執行效果:

 /
Enter value for user: DEXTER
old  8:   username varchar2(30) :='&USER';
new  8:   username varchar2(30) :='DEXTER';
Enter value for tb: ACCOUNT
old  9:   tablename varchar2(30) :='&TB' ;
new  9:   tablename varchar2(30) :='ACCOUNT' ;
Enter value for usedtbs: USERS
old 11:   dbms_compression.get_compression_ratio('&Usedtbs',
new 11:  dbms_compression.get_compression_ratio('USERS',
Sampling table: DEXTER.ACCOUNT
Estimated compression ratio: 1
Compression Type: "Compress For OLTP"
 
PL/SQL procedure successfully completed.

因為表中的重復值非常少,上文中Estimated compression ratio: 1,表示沒有任何壓縮效果。
高級壓縮,基於塊內的壓縮。所以就算有重復值,但是沒有在一個塊中,那麼高級壓縮還是無法起作用。

這裡重點介紹一個參數 COMPTYPE,它一共有6個選項,分別是

COMP_NOCOMPRESS               CONSTANT NUMBER := 1;
COMP_FOR_OLTP                 CONSTANT NUMBER := 2;
COMP_FOR_QUERY_HIGH           CONSTANT NUMBER := 4;
COMP_FOR_QUERY_LOW            CONSTANT NUMBER := 8;
COMP_FOR_ARCHIVE_HIGH         CONSTANT NUMBER := 16;
COMP_FOR_ARCHIVE_LOW          CONSTANT NUMBER := 32;

Query high 以下都是HCC(HybridColumnar Compression)的內容,因為與Exadata的存儲節點相關,所以在非Exadata一體機環境無法使用。不過有意思的是,你可以在普通環境下使用get_compression_ratio來預估壓縮的比例。

11gr2以前compression-advisor存儲過程下載地址:

http://download.csdn.net/detail/renfengjun/7514723

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved