视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Oracle压缩功能小结2—预估表压缩的效果
2020-11-09 08:28:57 责编:小采
文档

在使用压缩之前,我们可以估算一下使用压缩能够拥有多大的效果。 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 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

下载本文
显示全文
专题