ORACLE的数据段压缩技术 part2
上一篇 / 下一篇 2008-02-21 11:05:47 / 个人分类:Oracle
相同的记录会有同样的指针,例如在本例中,row1与row 15,23,49指向的都是同一个位置。
bindmp: 00 05 ca c1 15 *指向记号表中记录的指针,相同的记录同样的指针 tab 1, row 0, @0x1d99 tl: 5 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 2] c1 15 col 1: *NULL* col 2: [ 5] 43 col 3: [ 3] c2 50 03 col 4: [ 2] c2 09 col 5: [ 7] 77 b4 col 6: [ 3] c2 col 7: [ 5] 53 4d 49 54 48 bindmp: tab 1, row 1, @0x1d94 tl: 5 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 2] c1 col 1: [ 2] c2 04 col 2: [ 8] 53 41 col 3: [ 3] c2 4d 63 col 4: [ 2] c2 11 col 5: [ 7] 77 b5 02 14 01 01 01 col 6: [ 3] c2 4b 64 col 7: [ 5] 41 bindmp: ... ... ... ... tab 1, row 675, @0x tl: 5 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 2] c1 0b col 1: *NULL* col 2: [ 5] 43 col 3: [ 3] c2 4e 53 col 4: [ 2] c2 0e col 5: [ 7] 77 b6 01 17 01 01 01 col 6: [ 3] c2 50 23 col 7: [ 6] 4d 49 bindmp: end_of_block_dump End dump data blocks tsn: 4 file#: 4 minblk 3860 maxblk 3860 |
3段压缩的优缺点、限制及性能
3.1优点
节省存储空间:这也是ORACLE实现段数据压缩的目的所在,随着数据的海量,历史数据的不断的堆积,段压缩技术在节省空间的同时也节省了单位历史数据的存储成本。
性能会有提升:段压缩针对的都应该是历史数据,这样的数据的特点是海量、不变更一般只用于查询,这里所说的性能的提升是在CPU不是瓶颈的前提下,且是查询性能的提升。因为表段被压缩后其所占的数据块会大量的减少,单次的IO会读取更多的block,也因此会减少对buffer cache的占用。段压缩技术会提升IO的性能,如今cpu不断的加速,从双核到四核不断的加速,ibm p6的cpu也已经问世,也因此时间换空间的优化技术也越来越流行。
3.2缺点及限制
会增加些额外的cpu的负担:上面已经提到,ORACLE段压缩技术是时间换空间的一种体现,存储空间的减少势必会导致建立压缩段和查询数据时压缩及解压缩时cpu的消耗。
ORACLE
ORACLE
段压缩技术适用于数据仓库这样的应用,一张表压缩后最好避免DML类型的操作,特别是update的操作,update操作会导致行迁移的发生,使得压缩表可能比原表占用的空间还大,所以切忌对压缩表做update操作,这样的技术应该用在合适的地方。
3.3性能
很多人担心表压缩后性能会有所降低,3.1中已经谈到了查询的性能会有所提升。关于这一点wanghai做了充份的测试,测试表明不论是全表扫描还是通过索引回表扫描压缩表的性能都不会比非压缩表差。至于dml,这是不推荐的,如果非要执行这样的操作,非批量装载操作insert操作之外的普通的insert操作的数据是不进行压缩的,因些压缩表的与常规表的insert性能是一样的。Update操作压缩表时会引发迁移,在浪费空间的同时也会牺牲性能。
4压缩前如何得到表的压缩比?
4.1压缩比定义
在要不要对一个表压缩时,很多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; END 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> |
5如何使用段压缩技术
创建一张空的压缩表
压缩已有一张非分区表
压缩一张已有的分区表
压缩索引段
6加大压缩比的方法
常常会有人问,怎样才能加大一个表的压缩比,节约更多的空间呢?明析了ORACLE段压缩技术的原理,回答这样的问题是很容易的。如果一个块中相同的数据越多,压缩比也就越大,因此对表中的数据进行排序后压缩可以达到这样的目的。问题又来了,表中的列如果很多,选取哪一更进行排序呢?在实际的测试中总结起来,一个列的distinct值的数据与表压缩后占的block相近时,此时压缩比是最优的,选取哪一列在实际工作中是需要测试的。
还以表T_28672为例,含28672条数据,已压缩,其中EMPNO有14个不同的值,COMM列含有4个不同的值。
SQL> create table T_28672_EMPNO compress 2 as select * from T_28672 order by EMPNO; Table created. SQL> create table T_28672_COMM compress 2 as select * from T_28672 order by COMM; Table created. SQL> execute show_space('T_28672'); Unformatted Blocks ..................... 0 FS1 Blocks (0-25) ...................... 0 FS2 Blocks (25-50) ..................... 0 FS3 Blocks (50-75) ..................... 0 FS4 Blocks (75-100)..................... 0 Full Blocks ............................ 43 Total Blocks............................ 48 Total Bytes............................. 393,216 Total MBytes............................ 0 Unused Blocks........................... 0 Unused Bytes............................ 0 Last Used Ext FileId.................... 4 Last Used Ext BlockId................... 3,897 Last Used Block......................... 8 PL/SQL procedure successfully completed. SQL> execute show_space('T_28672_EMPNO); ERROR: ORA-01756: quoted string not properly terminated SQL> execute show_space('T_28672_EMPNO'); Unformatted Blocks ..................... 0 FS1 Blocks (0-25) ...................... 0 FS2 Blocks (25-50) ..................... 0 FS3 Blocks (50-75) ..................... 0 FS4 Blocks (75-100)..................... 0 Full Blocks ............................ 40 Total Blocks............................ 48 Total Bytes............................. 393,216 Total MBytes............................ 0 Unused Blocks........................... 3 Unused Bytes............................ 24,576 Last Used Ext FileId.................... 4 Last Used Ext BlockId................... 3,769 Last Used Block......................... 5 PL/SQL procedure successfully completed. SQL> execute show_space('T_28672_COMM'); Unformatted Blocks ..................... 0 FS1 Blocks (0-25) ...................... 0 FS2 Blocks (25-50) ..................... 0 FS3 Blocks (50-75) ..................... 0 FS4 Blocks (75-100)..................... 0 Full Blocks ............................ 41
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG:
清空Cookie -
联系我们 -
ITPUB个人空间 -
交流论坛 -
空间列表 -
站点存档 -
升级自己的空间
Powered by X-Space
3.0.2
© 2001-2007 Comsenz Inc.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||

