oracle 海量数据之利器“数据压缩”实际应用及优缺点汇总

本文详细探讨了Oracle数据库在处理海量数据时的数据压缩技术,包括其实际应用场景、优势与不足。通过数据压缩,可以有效节省存储空间,但可能增加CPU使用,适合大型数据库运维管理。
摘要由CSDN通过智能技术生成
引言:“数据压缩”以前对我来说还是比较新鲜的词,并不是没有听说过,而是没有实际使用过,之前一直做项目经理工作上也设计到数据库的运维,但由于存储设计的比较充裕,在加上性能运转的还能让客户接受,所以压缩技术基本上没怎么用,当时也怕对DML操作有负面影响!之所以现在要实验这方面的技术,也是因为二期我们的数据量暴增,对机器对性能对运维都用一定的压力和冲击,这也说明了这门技术是在特定环境、特定场合下来使用的,下面我们来详细讲一讲如何去使用这门技术---海量数据之利器“压缩compress”
一、应用场合
答:正如上面所说,压缩技术一般应用在“海量数据”的范畴,在大数据量下并且重复率高的情境下应该的效果才好,适合于OLAP(报表系统)不适合OLTP(在线交易系统),当数据量小时作用还不是很大,只要数据量达到一定程度的时候使用这门技术才有意义。
二、压缩技术的好处
1.节约空间:我认为压缩技术的最大好处就是节约空间,在存储设备空间很紧张的情况下更需要使用压缩技术来缓解
2.减少memory/IO开销:当使用了压缩技术后,同等记录对应的数据块相对较少,自然而然IO开销就小了
3.提高数据处理效率:原本10个数据块的,经过压缩后变成5个数据块,但还是那些数据,可效率提高了一倍。
三、压缩原理
答:我们都用过rar压缩zip压缩,其实这些压缩的原理都很相似,当然在细微处理上有不同,数据块压缩原理上是使用长度较短符号来代替列中的每个值,由于符号占用空间小于实际值,从而达到节约空间的效果,当列中重复值越多压缩效果越好。
四、数据压缩不适合OLTP系统
1.OLTP是一种多事务短时间片系统,有大量的DML操作,而DML操作我们都知道是有锁lock的(insert  update  delete)当数据块中记录数多起来时,导致访问这个数据块的用户就多,就是产生争用和等待,从而降低了效率。
2.数据插入、更新和索引键值更新时,都要先解压缩再更新,等待的时间会更长。
五、分区表的压缩
1.分区表的每个分区都可以独立压缩
2.有些时候,分区表在创建时不设置分区压缩属性,当某个分区需要压缩时,再独立进行压缩
3.如果在表级设置压缩属性的话,那么所有分区都会启动压缩功能,反正如果是某几个分区独立压缩,表级属性上什么也不写的。
实验
create table leo_partition1 (object_id,object_name)       创建一个六个分区的分区表,没有指定压缩
partition by range (object_id)
(
partition leo_p1 values less than (1000),
partition leo_p2 values less than (2000),
partition leo_p3 values less than (3000),
partition leo_p4 values less than (4000),
partition leo_p5 values less than (5000),
partition leo_max values less than (maxvalue)
)
as select object_id,object_name from dba_objects;
LS@LEO> select count(*) from leo_partition1;
  COUNT(*)
----------
     10351
LS@LEO> select partition_name,compression from user_tab_partitions where table_name='LEO_PARTITION1'; 
PARTITION_NAME                 COMPRESS
------------------------------ --------
LEO_MAX                        DISABLED
LEO_P1                         DISABLED
LEO_P2                         DISABLED
LEO_P3                         DISABLED
LEO_P4                         DISABLED
LEO_P5                         DISABLED
LS@LEO> alter table leo_partition1 compress;                            例如 定义表级压缩属性,此时所有分区都压缩
LS@LEO> alter table leo_partition1 modify partition leo_p1 compress;    我们测试准对leo_p1 和 leo_p5分区进行压缩,来说明分区可以独立压缩
Table altered.
LS@LEO> alter table leo_partition1 modify partition leo_p5 compress;
Table altered.
LS@LEO> select partition_name,compression from user_tab_partitions where table_name='LEO_PARTITION1';
PARTITION_NAME                 COMPRESS
------------------------------ -----------------------
LEO_MAX                       DISABLED
LEO_P1                         ENABLED
LEO_P2                         DISABLED
LEO_P3                         DISABLED
LEO_P4                         DISABLED
LEO_P5                         ENABLED
6 rows selected.
LS@LEO> alter table leo_partition1 modify partition leo_p5 nocompress;      我们还可以取消压缩
Table altered.
LS@LEO> select partition_name,compression from user_tab_partitions where table_name='LEO_PARTITION1';   leo_p5分区已经取消压缩
PARTITION_NAME                 COMPRESS
------------------------------ -----------------------
LEO_MAX                      DISABLED
LEO_P1                         ENABLED
LEO_P2                         DISABLED
LEO_P3                         DISABLED
LEO_P4                         DISABLED
LEO_P5                         DISABLED
六、分区索引的压缩
1.分区表索引中不能对单个独立分区索引设置压缩,要么整体压缩要么不压缩。
2.如果创建分区表索引时未设置压缩,以后都不能在设置了
LS@LEO> create index leo_partition1_index on leo_partition1(object_id) local;                创建时没有设置压缩
Index created.
LS@LEO> select index_name,compression from user_indexes where table_name='LEO_PARTITION1';   分区表索引没有压缩
INDEX_NAME                     COMPRESS
------------------------------ --------
LEO_PARTITION1_INDEX           DISABLED
LS@LEO> select partition_name,compression from user_ind_partitions where index_name='LEO_PARTITION1_INDEX';   独立分区索引也没有压缩
PARTITION_NAME                 COMPRESS
------------------------------ --------
LEO_MAX                        DISABLED
LEO_P1                         DISABLED
LEO_P2                         DISABLED
LEO_P3                         DISABLED
LEO_P4                         DISABLED
LEO_P5                         DISABLED
LS@LEO> alter index leo_partition1_index rebuild partition leo_p5 compress;       
alter index leo_partition1_index rebuild partition leo_p5 compress
*
ERROR at line 1:
ORA-28659: COMPRESS must be specified at object level first                     报错,压缩必须首先在对象级别指定
3.必须创建分区表索引时一次性指定好压缩属性,以后才能对独立分区索引压缩进行修改
LS@LEO> create index leo_partition1_index on leo_partition1(object_id) local compress;       创建时指定
Index created.
LS@LEO> select index_name,compression from user_indexes where table_name='LEO_PARTITION1';   分区表索引已压缩
INDEX_NAME                     COMPRESS
------------------------------ --------
LEO_PARTITION1_INDEX           ENABLED
LS@LEO> select partition_name,index_name,compression from user_ind_partitions where index_name='LEO_PARTITION1_INDEX';独立分区索引也压
PARTITION_NAME                 INDEX_NAME                     COMPRESS
------------------------------ ------------------------------ --------
LEO_MAX                        LEO_PARTITION1_INDEX           ENABLED
LEO_P1                         LEO_PARTITION1_INDEX           ENABLED
LEO_P2                         LEO_PARTITION1_INDEX           ENABLED
LEO_P3                         LEO_PARTITION1_INDEX           ENABLED
LEO_P4                         LEO_PARTITION1_INDEX           ENABLED
LEO_P5                         LEO_PARTITION1_INDEX           ENABLED
6 rows selected.
LS@LEO> alter index leo_partition1_index rebuild partition leo_p3 nocompress;         独立分区索引取消压缩
Index altered.
LS@LEO> alter index leo_partition1_index rebuild partition leo_p4 nocompress;
Index altered.
LS@LEO> alter index leo_partition1_index rebuild partition leo_p5 nocompress;
Index altered.
LS@LEO> select partition_name,index_name,compression from user_ind_partitions where index_name='LEO_PARTITION1_INDEX';
PARTITION_NAME                 INDEX_NAME                     COMPRESS
------------------------------ ------------------------------ --------
LEO_MAX                        LEO_PARTITION1_INDEX           ENABLED
LEO_P1                         LEO_PARTITION1_INDEX           ENABLED
LEO_P2                         LEO_PARTITION1_INDEX           ENABLED
LEO_P3                         LEO_PARTITION1_INDEX           DISABLED
LEO_P4                         LEO_PARTITION1_INDEX           DISABLED
LEO_P5                         LEO_PARTITION1_INDEX           DISABLED
七、数据压缩对空间影响
1.节约空间:数据压缩会节约大量存储空间,我们创建一个压缩表和一个普通表,来对比节约空间的效果
LS@LEO> create table leo_compress_table compress as select * from dba_objects;            压缩表
Table created.
LS@LEO> create table leo_nocompress_table  as select * from dba_objects;                  普通表
Table created.
LS@LEO> select segment_name,extent_id,bytes from user_extents where segment_name in ('LEO_COMPRESS_TABLE','LEO_NOCOMPRESS_TABLE');
SEGMENT_NAME            EXTENT_ID      BYTES
---------------------- ---------- ----------
LEO_COMPRESS_TABLE              0      65536
LEO_COMPRESS_TABLE              1      65536
LEO_COMPRESS_TABLE              2      65536
LEO_COMPRESS_TABLE              3      65536
LEO_COMPRESS_TABLE              4      65536
LEO_COMPRESS_TABLE              5      65536
LEO_COMPRESS_TABLE              6      65536      同样数据量,压缩表占用7个区,使用0.43M空间
LEO_NOCOMPRESS_TABLE            0      65536
LEO_NOCOMPRESS_TABLE            1      65536
LEO_NOCOMPRESS_TABLE            2      65536
LEO_NOCOMPRESS_TABLE            3      65536
LEO_NOCOMPRESS_TABLE            4      65536
LEO_NOCOMPRESS_TABLE            5      65536
LEO_NOCOMPRESS_TABLE            6      65536
LEO_NOCOMPRESS_TABLE            7      65536
LEO_NOCOMPRESS_TABLE            8      65536
LEO_NOCOMPRESS_TABLE            9      65536
LEO_NOCOMPRESS_TABLE           10      65536
LEO_NOCOMPRESS_TABLE           11      65536
LEO_NOCOMPRESS_TABLE           12      65536
LEO_NOCOMPRESS_TABLE           13      65536
LEO_NOCOMPRESS_TABLE           14      65536
LEO_NOCOMPRESS_TABLE           15      65536
LEO_NOCOMPRESS_TABLE           16    1048576      同样数据量,普通表占用17个区&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值