oracle了解一下压缩表

上传人:第*** 文档编号:32692244 上传时间:2018-02-12 格式:DOC 页数:11 大小:60KB
返回 下载 相关 举报
oracle了解一下压缩表_第1页
第1页 / 共11页
oracle了解一下压缩表_第2页
第2页 / 共11页
oracle了解一下压缩表_第3页
第3页 / 共11页
oracle了解一下压缩表_第4页
第4页 / 共11页
oracle了解一下压缩表_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《oracle了解一下压缩表》由会员分享,可在线阅读,更多相关《oracle了解一下压缩表(11页珍藏版)》请在金锄头文库上搜索。

1、数据被压缩的原理在于,对于数据块里的重复值来说,只保留一份。保存在数据块里的压缩数据是自我包含的。也就是说,对于将压缩的数据进行解压来说,所有需要的信息都在数据块里了,而不需要参考数据块以外的其他数据。数据块里的所有重复数据行和数据列都只存放一次,并放在数据块的开始部分,这块区域叫做数据块的 symbol table。也就是说,同一个数据块里放了两个表的数据。这一点有点像 class table。数据行里如果存在重复的值,则该重复值去掉,并在原来的位置上放了一个很短的引用,指向 symbol table。除了数据块开始部分的 symbol table 以外,压缩数据块与普通的数据块没什么两样。

2、注意,在 9i 里,压缩表在创建以后就不能修改结构的,而 10g 则没有这个限制了,但是不能对添加的列提供缺省值。对于压缩数据块的访问来说,并没有很消耗资源的解压缩操作。这也就是说,在考虑是否要启用压缩时,并不需要考虑对于查询性能的影响。只能在进行批量数据加载的时候,完成压缩操作。在加载数据并压缩过程中,CPU 资源的消耗会有 50%的增长。只有当数据批量插入或加载的时候完成压缩,这些操作包括:SQL*Loader 的直接路径加载。CREATE TABLECOMPRESS AS SELECT。并行 insert 或带有 append 提示的串行 insert。你也可以发出 ALTER TABL

3、EMOVE COMPRESS,从而将表里已有的数据进行压缩。对于压缩表的 update 操作的效率极其低下,如果一个表要经常被 update,则不应该对该表启用压缩。因为 update 时,需要先将数据解压,然后对解压后的数据进行更新,更新结束以后再次压缩。除了 LOB 以外的数据类型都可以被压缩。另外,如果表里的列超过 255 个,则压缩被禁用。也提供对索引的压缩,包括 B 树索引和 bitmap 索引,以及 IOT 表。来了解一下压缩表的内部结构。SQL create table t_seed as2 select chr(trunc(dbms_random.value(65,67) c1

4、,chr(trunc(dbms_random.value(65,67) c2,3 trunc(dbms_random.value(0,2) c1flag,trunc(dbms_random.value(0,2) c2flag4 from dba_objects where rownum create table t_comp_1 compress as2 select decode(c1flag,1,lpad(c1,10,c1),null) as c1,3 decode(c2flag,1,lpad(c2,10,c2),null) as c2 from t_seed;表已创建。SQL selec

5、t distinct dbms_rowid.rowid_relative_fno(rowid) as file#,2 dbms_rowid.rowid_block_number(rowid) as block# from t_comp_1 order by file#,block#;FILE# BLOCK#- - 4 76044 7605SQL alter system dump datafile 4 block 7604;系统已更改。data_block_dump,data header at 0xcc19a7c=tsiz: 0x1f80hsiz: 0x5cepbl: 0x0cc19a7cb

6、dba: 0x01001db476543210flag=-0-ntab=2 这里的 2 说明该数据块里有 2 个表,一个 symbol table,一个实际的表。nrow=725frre=-1fsbo=0x5cefseo=0x1147avsp=0x3dtosp=0x3dr0_9ir2=0x0mec_kdbh9ir2=0x9 这里的 9 说明该数据块里重复值有 9 种情况。 76543210shcf_kdbh9ir2=-76543210flag_9ir2=-R-Cfcls_9ir23= 0 32768 32768 0x1c:pti0nrow=11offs=0 这部分说明 symbol table

7、 里有 6 条记录。0x20:pti1nrow=717 offs=11 这部分说明该数据块里存放的实际表里的记录行数为 717 行。0x24:pri0offs=0x1f610x26:pri1offs=0x1f5c.tab 0, row 0, 0x1f61tl: 5 fb: -H-FL- lb: 0x0 cc: 2col 0: *NULL*col 1: *NULL*bindmp:00 a7 02 ff fftab 0, row 1, 0x1f5ctl: 5 fb: -H-FL- lb: 0x0 cc: 2col 0: *NULL*col 1: 10 42 42 42 42 42 42 42 42

8、 42 42bindmp: 00 50 02 ff0atab 0, row 2, 0x1f57tl: 5 fb: -H-FL- lb: 0x0 cc: 2col 0: *NULL*col 1: 10 41 41 41 41 41 41 41 41 41 41bindmp: 006c02 ff 09tab 0, row 3, 0x1f52tl: 5 fb: -H-FL- lb: 0x0 cc: 2col 0: 10 42 42 42 42 42 42 42 42 42 42col 1: *NULL*bindmp: 00 55 020afftab 0, row 4, 0x1f4dtl: 5 fb:

9、 -H-FL- lb: 0x0 cc: 2col 0: 10 42 42 42 42 42 42 42 42 42 42col 1: 10 42 42 42 42 42 42 42 42 42 42bindmp: 00 34 020a0atab 0, row 5, 0x1f48tl: 5 fb: -H-FL- lb: 0x0 cc: 2col 0: 10 42 42 42 42 42 42 42 42 42 42col 1: 10 41 41 41 41 41 41 41 41 41 41bindmp: 00 22 020a09tab 0, row 6, 0x1f43tl: 5 fb: -H-

10、FL- lb: 0x0 cc: 2col 0: 10 41 41 41 41 41 41 41 41 41 41col 1: *NULL*bindmp: 00 5b 02 09 fftab 0, row 7, 0x1f3etl: 5 fb: -H-FL- lb: 0x0 cc: 2col 0: 10 41 41 41 41 41 41 41 41 41 41col 1: 10 42 42 42 42 42 42 42 42 42 42bindmp: 002c02 090atab 0, row 8, 0x1f39tl: 5 fb: -H-FL- lb: 0x0 cc: 2col 0: 10 41

11、 41 41 41 41 41 41 41 41 41col 1: 10 41 41 41 41 41 41 41 41 41 41bindmp: 00 38 02 09 09tab 0, row 9, 0x1f66tl: 13 fb: -H-FL- lb: 0x0 cc: 1col 0: 10 41 41 41 41 41 41 41 41 41 41bindmp: 00 06 d2 41 41 41 41 41 41 41 41 41 41tab 0, row 10, 0x1f73tl: 13 fb: -H-FL- lb: 0x0 cc: 1col 0: 10 42 42 42 42 42

12、 42 42 42 42 42bindmp: 00 06 d2 42 42 42 42 42 42 42 42 42 42以上 tab 0 的部分就是所谓的 symbol table 里所存放的记录了。可以看到一共有 11 条记录。实际就是对 c1 和 c2 这两列所存在的值的穷举,如下所示:可能的情况 C1 列 C2 列1 AAAAAAAAAA Null2 BBBBBBBBBB Null3 Null AAAAAAAAAA4 Null BBBBBBBBBB5 AAAAAAAAAA AAAAAAAAAA6 AAAAAAAAAA BBBBBBBBBB7 BBBBBBBBBB AAAAAAAAAA8

13、 BBBBBBBBBB BBBBBBBBBB9 Null Null而在该数据块里的每条记录就是对上面这 9 种情况的描述,不过它穷举出来的情况要更多点。多出来的也就是最后两条 cc 为 1 的记录。也就是说有可能只压缩一列。在我们这个例子里,因为只有两个列,所以没有这种情况。如果表里的列很多,则有可能只压缩一列。在 tab 0 里的每条记录里,记录了 c1 列和 c2 列的可能的取值,同时还记录了 bindmp,这表示该种组合的一些元数据。比如对于 symbol table 里的 row 4 来说:tab 0, row 4, 0x1f4dtl: 5 fb: -H-FL- lb: 0x0 cc:

14、 2col 0: 10 42 42 42 42 42 42 42 42 42 42col 1: 10 42 42 42 42 42 42 42 42 42 42bindmp: 00 34 020a0a前两个字节表示该数据块里有多少条记录属于该组合。这里为十六进制的 00 34,换算成十进制,也就是 52。说明在该数据块里的 717 条记录当中,有 52 条记录的(c1,c2)=(BBBBBBBBBB,BBBBBBBBBB)。02 表示压缩的列的个数为 2 个列。我们来验证一下:SQL select count(*) from(2 select c1,c2 from t_comp_1 where

15、 rownum create table t_comp_2 compress as2 select decode(c1flag,1,lpad(c1,10,c1),null) as c1,rownum id1,3 decode(c2flag,1,lpad(c2,10,c2),null) as c2,4 chr(trunc(dbms_random.value(65,80) c3 from t_seed;表已创建。SQL select distinct dbms_rowid.rowid_relative_fno(rowid) as file#,2 dbms_rowid.rowid_block_number(rowid) as block# from t_comp_2 order by file#,block#;FILE# BLOCK#- -4 69004 6901SQL alter system dump datafile 4 block 6900;系统已更改。打开转储文件,可以看到下面的部分:r0_9ir2=0x0mec_kdbh9ir2=0x1876543210 shcf_kdbh9ir2=-

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号