姓名:杨宝秋,OCM,ACE。近8年的TB级数据库设计、建设、管理、运行维护、调优经验,也做了7年的Hp和IBM Rs6000的系统管理员,而且是获得了BCFP认证的SAN管理员,现为中国联通黑龙江分公司数据库主管。

ORACLE的数据段压缩技术 part2

上一篇 / 下一篇  2008-02-21 11:05:47 / 个人分类:Oracle

2.2.4.3重复的各条记录

相同的记录会有同样的指针,例如在本例中,row1row 152349指向的都是同一个位置。

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] 434c45 52 4b

col 3: [ 3] c2 50 03

col 4: [ 2] c2 09

col 5: [ 7] 77 b40c11 01 01 01

col 6: [ 3] c24a46

col 7: [ 5] 53 4d 49 54 48

bindmp:2c00 01 08 00

tab 1, row 1, @0x1d94

tl: 5 fb: --H-FL-- lb: 0x0 cc: 8

col 0: [ 2] c11f

col 1: [ 2] c2 04

col 2: [ 8] 53 414c45 53 4d 41 4e

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] 414c4c45 4e

bindmp:2c00 01 08 07

... ...

... ...

tab 1, row 675, @0x106a

tl: 5 fb: --H-FL-- lb: 0x0 cc: 8

col 0: [ 2] c1 0b

col 1: *NULL*

col 2: [ 5] 434c45 52 4b

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 494c4c45 52

bindmp:2c00 01 08 0b

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 p6cpu也已经问世,也因此时间换空间的优化技术也越来越流行。

3.2缺点及限制

*        会增加些额外的cpu的负担:上面已经提到,ORACLE段压缩技术是时间换空间的一种体现,存储空间的减少势必会导致建立压缩段和查询数据时压缩及解压缩时cpu的消耗。

*        ORACLE11g之前的版本只会在批量装载时对数据进行压缩:虽然在Oracle9i中引入了段压缩技术,但只能对批量装载操作(比如sql*loader直接路径装载,CTASinsertappend提示等)涉及的数据进行压缩,普通的DML操作的数据是无法压缩的,这应该是对于写操作的压缩难题没有解决的缘故。

*        ORACLE11g之前的版本不支持非结构化数据压缩的压缩,例如LOB类型的数据是不支持的,LOB类型的非结构化数据如果也可以做压缩会极大的减少数据库对存储空间的占用。

*        段压缩技术适用于数据仓库这样的应用,一张表压缩后最好避免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;

 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>

5如何使用段压缩技术

创建一张空的压缩表

 

压缩已有一张非分区表

 

压缩一张已有的分区表

 

压缩索引段

6加大压缩比的方法

常常会有人问,怎样才能加大一个表的压缩比,节约更多的空间呢?明析了ORACLE段压缩技术的原理,回答这样的问题是很容易的。如果一个块中相同的数据越多,压缩比也就越大,因此对表中的数据进行排序后压缩可以达到这样的目的。问题又来了,表中的列如果很多,选取哪一更进行排序呢?在实际的测试中总结起来,一个列的distinct值的数据与表压缩后占的block相近时,此时压缩比是最优的,选取哪一列在实际工作中是需要测试的。

还以表T_28672为例,含28672条数据,已压缩,其中EMPNO14个不同的值,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:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2008-09-07  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 6745
  • 日志数: 64
  • 图片数: 1
  • 建立时间: 2008-01-30
  • 更新时间: 2008-07-29

RSS订阅