ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle数据压缩初探 -- 1

Oracle数据压缩初探 -- 1

原创 Linux操作系统 作者:mikeliuy 时间:2012-09-21 09:08:33 0 删除 编辑
一、测试准备:
1、创建两张表,t_compress压缩表,t_nocompress未压缩表。
2、使用dba_objects视图作为插入数据;每张表的数据量为100万条。

MIKE@ PROD> create table t_nocompress as select rownum id,a.* from sys.dba_objects a where 1=2; 

Table created.

 

MIKE@ PROD> alter table t_nocompress nologging;

Table altered.

运行下面的代码:


MIKE@ PROD> create table t_compress compress as select * from t_nocompress;

Table created.

二、比较两张表的占用空间

MIKE@ PROD> select segment_name,count(extent_id) extent_num,sum(bytes) space_size

  2  from user_extents

  3  where segment_name in ('T_COMPRESS','T_NOCOMPRESS')

  4  group by segment_name;

 

SEGMENT_NAME              EXTENT_NUM SPACE_SIZE

-------------------------  ----------  ----------

T_COMPRESS                            53    39845888

T_NOCOMPRESS                      86  125829120


根据比较压缩的表比未压缩的少33个extent,并且空间大小约是未压缩的四分之一。

在dba_objects中有object_id,object_name这两个字段,它们的值重复率非常低,几乎没有重复值,现在再创建两张表,只有这两个字段,一张压缩,一张不压缩,再看看它们所占用的空间。

MIKE@ PROD> create table t_compress1 compress as select object_id,object_name from sys.dba_objects

 

Table created.

 

MIKE@ PROD> create table t_nocompress1 as select object_id,object_name from sys.dba_objects;

 

Table created.

 

MIKE@ PROD> select segment_name,count(extent_id) extent_num,sum(bytes) space_size

  2  from user_extents

  3  where segment_name in ('T_COMPRESS1','T_NOCOMPRESS1')

  4  group by segment_name;

 

SEGMENT_NAME    EXTENT_NUM SPACE_SIZE

--------------- ---------- ----------

T_COMPRESS1             17    2097152

T_NOCOMPRESS1            17     2097152

压缩、未压缩的表所占空间是一样的。

综上,压缩对于值重复率高的表,在节省存储空间上是非常有效的;对于值重复率低的(比如主键),是没有什么效果的。

三、在数据库中,索引也是需要存储空间的,现在来看看它的情况。

MIKE@ PROD> create index idx_t_compress_id on t_compress(object_id) compress;

Index created.

 

MIKE@ PROD> create index idx_t_compress_type on t_compress(object_type) compress;

Index created.

 

MIKE@ PROD> create index idx_t_nocompress_id on t_nocompress(object_id);

Index created.

 

MIKE@ PROD> create index idx_t_nocompress_type on t_nocompress(object_type);

Index created.

 

MIKE@ PROD> select segment_name,count(extent_id) extent_num,sum(bytes) space_size

  2  from user_extents

  3  where segment_name in ('IDX_T_COMPRESS_ID','IDX_T_NOCOMPRESS_ID','IDX_T_COMPRESS_TYPE','IDX_T_NOCOMPRESS_TYPE')

  4  group by segment_name;

 

SEGMENT_NAME              EXTENT_NUM SPACE_SIZE

------------------------- ---------- ----------

IDX_T_COMPRESS_TYPE                  28   13631488       #object_type重复率非常高

IDX_T_NOCOMPRESS_TYPE             37   23068672

IDX_T_NOCOMPRESS_ID                    33   18874368      #通过前面的代码可以看出,ID是没有重复值的

IDX_T_COMPRESS_ID                          40   26214400

从上面的结果中,可以说值重复率高的字段上创建的索引,经过压缩的所占用的空间明显低于未压缩的;但是对于值重复率低的(比如主键),经过压缩的所占空间反而高于未压缩的。


所以,压缩技术适合值重复率高的应用场景;对值重复率低的,反而不能体现出它的优势。




data.jpg

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26812308/viewspace-744687/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-06-18

  • 博文量
    72
  • 访问量
    421002