姓名:杨宝秋,OCM,ACE。近8年的TB级数据库设计、建设、管理、运行维护、调优经验,也做了7年的Hp和IBM Rs6000的系统管理员,而且是获得了BCFP认证的SAN管理员,现为中国联通黑龙江分公司数据库主管。
ORACLE的数据段压缩技术 part3
上一篇 /
下一篇 2008-02-21 11:27:21
/ 个人分类:Oracle
3段压缩的优缺点、限制及性能
节省存储空间:这也是ORACLE实现段数据压缩的目的所在,随着数据的海量,历史数据的不断的堆积,段压缩技术在节省空间的同时也节省了单位历史数据的存储成本。
性能会有提升:段压缩针对的都应该是历史数据,这样的数据的特点是海量、不变更一般只用于查询,这里所说的性能的提升是在CPU不是瓶颈的前提下,且是查询性能的提升。因为表段被压缩后其所占的数据块会大量的减少,单次的IO会读取更多的block,也因此会减少对buffer cache的占用。段压缩技术会提升IO的性能,如今cpu不断的加速,从双核到四核不断的加速,ibm p6的cpu也已经问世,也因此时间换空间的优化技术也越来越流行。
会增加些额外的cpu的负担:上面已经提到,ORACLE段压缩技术是时间换空间的一种体现,存储空间的减少势必会导致建立压缩段和查询数据时压缩及解压缩时cpu的消耗。
表压缩不支持超过255列
以BasicFile(相对于11g推出的SecureFiles而言)方式存储的LOB型数据段在表压缩时是不会被压缩的,11g推出的SecureFiles支持LOB的压缩,这方面可以参照11g的联机文档。
ORACLE11g之前的版本只会在批量装载时对数据进行压缩:虽然在Oracle9i中引入了段压缩技术,但只能对批量装载操作(比如sql*loader直接路径装载,CTAS,insert加append提示等)涉及的数据进行压缩,普通的DML操作的数据是无法压缩的,这应该是对于写操作的压缩难题没有解决的缘故。
索引组织表及含有overflow段的表或分区表是不支持表压缩的。
不能显示的(explicitly)为hash分区及hash和list子分区定设定压缩选项,这些分区的压缩选项可以从表空间、表或分区的压缩属性继承过来。
外部表和是cluster组成部分的表是不支持压缩的。
段压缩技术适用于数据仓库这样的应用,一张表压缩后最好避免DML类型的操作,特别是update的操作,update操作会导致行迁移的发生,使得压缩表可能比原表占用的空间还大,所以切忌对压缩表做update操作,这样的技术应该用在合适的地方。
很多人担心表压缩后性能会有所降低,3.1中已经谈到了查询的性能会有所提升。关于这一点wanghai做了充份的测试,测试表明不论是全表扫描还是通过索引回表扫描压缩表的性能都不会比非压缩表差。至于dml,这是不推荐的,如果非要执行这样的操作,非批量装载操作insert操作之外的普通的insert操作的数据是不进行压缩的,因此压缩表的与常规表的insert性能是一样的。Update操作压缩表时会引发迁移,在浪费空间的同时也会牺牲性能。
4压缩前如何得到表的压缩比?
在要不要对一个表压缩时,很多DBA很迷惑,因为不知道这个表压缩后是不是会节约空间。通俗的说来就是,如果压缩完的表与没压缩时空间占用一样大就没有必要折腾了。如果在压缩前能知道一个表的压缩比就好了,Carl Dudley在一篇文章写一了个计算压缩比的函数,压缩比可以这样的定义:
压缩比=压缩前表中的block的数量/压缩后表中block的数量
4.2计算压缩比函数
如下的函数以抽样的方式给出了计算压缩比的方法:
CREATEORREPLACEFUNCTIONCOMPRESSION_RATIO(TABNAMEVARCHAR2) RETURNNUMBERIS PCT NUMBER:= 0.000099;-- sample percentage BLKCNT NUMBER:= 0;-- original block count (should be < 10K) BLKCNTCNUMBER;-- compressed block count BEGIN EXECUTEIMMEDIATE' CREATE TABLE temp_uncompressed PCTFREE 0 AS SELECT * FROM ' || TABNAME || ' WHERE ROWNUM < 1'; WHILE((PCT < 100)AND(BLKCNT < 1000))LOOP --取样1000个块 EXECUTEIMMEDIATE'TRUNCATE TABLE temp_uncompressed'; EXECUTEIMMEDIATE'INSERT INTO temp_uncompressed SELECT * FROM ' || TABNAME || ' SAMPLE BLOCK (' || PCT || ',10)'; EXECUTEIMMEDIATE'SELECT COUNT(DISTINCT(dbms_rowid.rowid_block_number(rowid))) FROM temp_uncompressed' INTOBLKCNT; PCT := PCT * 10; ENDLOOP; EXECUTEIMMEDIATE'CREATE TABLE temp_compressed COMPRESS AS SELECT * FROM temp_uncompressed'; EXECUTEIMMEDIATE'SELECT COUNT(DISTINCT(dbms_rowid.rowid_block_number(rowid))) FROM temp_compressed' INTOBLKCNTC; EXECUTEIMMEDIATE'DROP TABLE temp_compressed'; EXECUTEIMMEDIATE'DROP TABLE temp_uncompressed'; RETURN(BLKCNT / BLKCNTC); END; |
4.3计算压缩比测试
SCOTT用户下有一张表为BIG_TABLE,如下以这张表做一下测试一下:
4.3.1为方便调用建一过程
CREATEORREPLACEPROCEDURECOMPRESS_TEST(P_COMPVARCHAR2)IS COMP_RATIONUMBER; BEGIN COMP_RATIO := ROUND(COMPRESSION_RATIO(P_COMP),2); DBMS_OUTPUT.PUT_LINE('Compression factor for table ' || P_COMP || ' is ' || COMP_RATIO); END; |
4.3.2调用测试
SQL>connectscott/tiger Connected. SQL>executecompress_test('BIG_TABLE'); Compression factorfortableBIG_TABLEis2.23 PL/SQLproceduresuccessfully completed. SQL> |
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG: