Oracle压缩总结2— 估计表压缩效应

时间:2023-03-08 17:22:59
Oracle压缩总结2—
估计表压缩效应

使用压缩前,我们可以估算压缩能有多大效果。

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

版权声明:本文博主原创文章,博客,未经同意不得转载。