Oracle中数据压缩功能小结(一)

2014-11-24 10:35:42 · 作者: · 浏览: 0
Oracle 数据库的压缩功能,大家听到这个词,一定就想到了节省硬盘空间吧。没错,它就是用来干这个的,但是向外延伸一下,它不仅可以节省硬盘空间,更可以节省带宽以及内存的使用(cpu有一点点损耗因为需要更多的计算取值操作,但是鉴于大多数环境下cpu都有空闲,所以也可以忽略了)。
Basic compression这个功能从9i开始就有提供,11gr1开始提供了新的压缩功能,即OLTP compression。Basic compression是包括在EE版本中的,不需要额外收费,但是OLTP compression则需要额外的Oracle Advanced Compression option license。高级?想用?掏钱吧。
下面的图片能够帮助你简单了解压缩块的原理:

\
简单来说,就是在block中会存有特殊的数据结构,symbol table。
Symbol table dump出来的内容如下所示:
tab 0, row 0, @0x1da4
tl: 7 fb: --H-FL-- lb: 0x0 cc: 12
col 0: *NULL*
col 1: [ 5] 56 41 4c 49 44
col 2: [ 1] 4e
col 3: *NULL*
col 4: [ 1] 4e
col 5: [ 1] 4e
col 6: [ 3] 53 59 53
col 7: [ 7] 78 6f 0a 1e 0d 39 19
col 8: [19] 32 30 31 31 2d 31 30 2d 33 30 3a 31 32 3a 35 36 3a 32 34
col 9: [ 2] c1 05
col 10: [ 5] 49 4e 44 45 58
col 11: [ 7] 78 6f 0a 1e 0d 39 19
bindmp: 00 2a 0c 15 20 24 22 复制代码真正的数据内容如下所示:
tab 1, row 0, @0x1d5e
tl: 16 fb: --H-FL-- lb: 0x0 cc: 15
col 0: *NULL*
col 1: [ 5] 56 41 4c 49 44
col 2: [ 1] 4e
col 3: *NULL*
col 4: [ 1] 4e
col 5: [ 1] 4e
col 6: [ 3] 53 59 53
col 7: [ 7] 78 6f 0a 1e 0d 39 18
col 8: [19] 32 30 31 31 2d 31 30 2d 33 30 3a 31 32 3a 35 36 3a 32 33
col 9: [ 2] c1 02
col 10: [ 5] 54 41 42 4c 45
col 11: [ 7] 78 6f 0a 1e 0e 10 01
col 12: [ 2] c1 03
col 13: [ 5] 49 43 4f 4c 24
col 14: [ 2] c1 15
bindmp: 2c 00 05 0a 05 31 1e cd 49 43 4f 4c 24 ca c1 15 复制代码有点类似于clustertable的block结构。简单来说就是只将block重复的内容存放一份到symbol table中,真正的表row piece引用存放在symbol table中的重复的内容。
因为Basiccompression和OLTPcompresssion都是块内压缩,所以就算拥有重复的内容,但是如果不在同一个块内存放,还是无法达到压缩的效果。
其原理先介绍到这,如果想要深入研究,可以参考老熊的blog。
Oracle压缩表数据块格式解析:http://www.laoxiong.net/dissect_compressed_block_part1. html
概念补完了,下面来简单介绍一下表压缩的几种类型:

1. 不压缩

别心急,我觉得它应该算是表压缩的类型之一,为了严谨一些,这里把它列为第一位。关键字nocompress。意思就是不压缩。默认创建表的时候会根据你的表空间的default属性来判断是否压缩。如果你的表空间定义为default compress,那么在此表空间创建非压缩表的时候则需要指定nocompress。例句:
create table t(id number) nocompress ; 复制代码
相关SQL(留给大家自己测试):
alter tablespace users default compress ;
select tablespace_name , compress_for from dba_tablespaces where tablespace_name='USERS' ;
create table ttt (id number) tablespace users ;
create table ttt2 (id number) tablespace users nocompress ;
select table_name , COMPRESS_FOR from user_tables where table_name in ('TTT','TTT2') ;
alter tablespace users default nocompress ;
select tablespace_name , compress_for from dba_tablespaces where tablespace_name='USERS' ; 复制代码 2. Basic compression
要点1:数据压缩只在direct path load的时候才会生效,对于普通的dml语句insert、update不会发生压缩。
要点2:压缩的时候为了保证最大程度的压缩,会自动设置pctfree为0(不是强制的,也可以在建表的时候设置pctfree为其他值)。
例句:
create table t(id number) compress ;
create table t(id number) compress basic ; 复制代码 3. OLTP compression
要点1:不像Basic compression,OLTP compression会对所有的dml生效,所以适用于OLTP系统。
要点2:自动设置pctfree为10,也可以自行设置。
要点3:oracle数据库内部的压缩动作不是在所有dml操作中都产生,只有当新的block中的数据存放到达了厥值的时候才会引发块内的压缩操作。
这里重点描述一下第三个要点:
oracle 数据库压缩数据块在批量模式下,而不是每个更改数据的操作都会引发压缩操作。
block中保留未压缩的数据达到了一个厥值的时候会引发块内的压缩操作。
当一个事务导致在block中的数据达到了厥值,所有的block中的内容就会被压缩。然后,更多的数据加入到块中,再一次达到厥值,整个block会重新压缩,以达到最大程度的压缩级别。这个过程会一直重复,直到oracle 数据库确定无法再从压缩上获得更高的效益。只有某些触发压缩条件的的事务会经历轻微的压缩开销。
所以多数oltp事务作用在压缩的块上面,会和未压缩的表上拥有相同的性能。
只有那些比较倒霉的操作会引发块内的压缩动作。


这里的详细内容可以参考aco白皮书。

例句:
create table t(id number) compress for oltp ; 复制代码 4. HCC(Hybrid Columnar Compression)


这个特性只为Exadata一体机环境下的 Oracle数据库提供。可以分为4个级别,即:
Query low
Query high
Archive low
Archive high
比较适用于更改不频繁或者readonly的表。根据上面排列的级别,相应的压缩比越来越高,看到介绍,竟然最多可以达到30倍,确实令人咋舌(当然这应该是最好的情况)。原理简单描述: