在使用压缩之前,我们可以估算一下使用压缩能够拥有多大的效果。 11gr2以前可以使用dbms_comp_advisor,具体代码已经在附件中给出。只需要执行两个文件dbmscomp.sql和prvtcomp.plb,然后使用dbms_comp_advisor.getratio存储过程即可。不再详细描述。 sql set
在使用压缩之前,我们可以估算一下使用压缩能够拥有多大的效果。
11gr2以前可以使用dbms_comp_advisor,具体代码已经在附件中给出。只需要执行两个文件dbmscomp.sql和prvtcomp.plb,然后使用dbms_comp_advisor.getratio存储过程即可。不再详细描述。
sql> set serveroutput onsql> execdbms_comp_advisor.getratio('sh','sales',10)sampling table: sh.salessampling percentage: 10%estimated compression ratio for the advancedcompression option is : 2.96
11gr2以后系统会自带一个dbms_compression的包,用来代替dbms_comp_advisor提供服务。
_sys@fake> desc dbms_compressionprocedure 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 defaultfunction get_compression_type returns number argumentname type in/out default? ----------------------------------------------------- ------ -------- ownname varchar2 in tabname varchar2 in row_id rowid inprocedure 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: dexterold 8: username varchar2(30) :='&user';new 8: username varchar2(30) :='dexter';enter value for tb: accountold 9: tablename varchar2(30) :='&tb' ;new 9: tablename varchar2(30) :='account' ;enter value for usedtbs: usersold 11: dbms_compression.get_compression_ratio('&usedtbs',new 11: dbms_compression.get_compression_ratio('users',sampling table: dexter.accountestimated compression ratio: 1compression 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