“数据压缩”以前对我来说还是比较新鲜的词,并不是没有听说过,而是没有实际使用过,之前一直做项目经理工作上也设计到数据库的运维,但由于存储设计的比较充裕,在加上性能运转的还能让客户接受,所以压缩技术基本上没怎么用,当时也怕对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