引言:“数据压缩”以前对我来说还是比较新鲜的词,并不是没有听说过,而是没有实际使用过,之前一直做项目经理工作上也设计到数据库的运维,但由于存储设计的比较充裕,在加上性能运转的还能让客户接受,所以压缩技术基本上没怎么用,当时也怕对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;
答:正如上面所说,压缩技术一般应用在“海量数据”的范畴,在大数据量下并且重复率高的情境下应该的效果才好,适合于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
----------
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
------------------------------ --------
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
------------------------------ -----------------------
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
------------------------------ -----------------------
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; 创建时没有设置压缩
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
------------------------------ --------
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
------------------------------ --------
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 报错,压缩必须首先在对象级别指定
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'; 分区表索引已压缩
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
------------------------------ --------
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.
------------------------------ ------------------------------ --------
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';
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
------------------------------ ------------------------------ --------
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; 压缩表
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_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个区&#
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个区&#