Exadata的中文白皮书中说到:
"Exadata Storage Server 提供了一种非常先进的压缩功能,称作混合列压缩 (HCC),可显著减少大型数据库的存储占用。混合列压缩可实现最高水平的数据压缩,由于 I/O 减少,可大幅降低成本并显著提高性能,这对于分析负载尤为有效。存储压缩率取决于具体的数据类型,通常在 5 至 20 倍之间。"
5-20倍是怎么来的?到底如何进行有效的HCC压缩?笔者通过实际的案例给来个直观的认识
在一个实际的案例中,用户有一张500GB+ 的表,考虑使用HCC进行压缩
首先那该表的部分分区进行测试。把该表部分数据导出成imp文件
imp PARFILE=imp.par file=ECC_FST_TMPHIS_FST_COLLECT_DETAIL_TMPHIS_${partname}.dmp log=imp_ECC_FST_TMPHIS_FST_COLLECT_DETAIL_TMPHIS_${partname}.log buffer=33554432 full=y IGNORE=y
创建几张空表,每个里面都包含两个分区,且设定为不同的压缩模式
SQL> select table_name,PARTITION_NAME,COMPRESSION, COMPRESS_FOR from user_tab_partitions;
TABLE_NAME PARTITION_NAME COMPRESS COMPRESS_FOR
------------------------------ ------------------------------ -------- ------------
BIGTABLE_ARCHIVE_HIGH P201125 ENABLED ARCHIVE HIGH
BIGTABLE_ARCHIVE_HIGH P201126 ENABLED ARCHIVE HIGH
BIGTABLE_ARCHIVE_LOW P201125 ENABLED ARCHIVE LOW
BIGTABLE_ARCHIVE_LOW P201126 ENABLED ARCHIVE LOW
BIGTABLE_NONE P201125 NONE
BIGTABLE_NONE P201126 NONE
BIGTABLE_QUERY_HIGH P201125 ENABLED QUERY HIGH
BIGTABLE_QUERY_HIGH P201126 ENABLED QUERY HIGH
BIGTABLE_QUERY_LOW P201125 ENABLED QUERY LOW
BIGTABLE_QUERY_LOW P201126 ENABLED QUERY LOW
使用imp进行导入后检查空间占用情况
SQL> select segment_name,round(100*sum(bytes)/1024/1024/1024)/100 GB from dba_segments where owner='SCOTT' and segment_name like 'BIGTABLE%' group by segment_name;
SEGMENT_NAME GB
------------------------- ------
BIGTABLE_ARCHIVE_LOW 8.49
BIGTABLE_QUERY_LOW 8.49
BIGTABLE_QUERY_HIGH 8.49
BIGTABLE_NONE 8.74
BIGTABLE_ARCHIVE_HIGH 8.5
结论1:
imp导入不同压缩类型的表,不会压缩数据
使用insert ... select 方式灌入,还是同样大小
create table
BIGTABLE_ARCHIVE_HIGH1 as select * from BIGTABLE_ARCHIVE_HIGH where 1=0;
insert into BIGTABLE_ARCHIVE_HIGH1 select * from BIGTABLE_ARCHIVE_HIGH;
SEGMENT_NAME GB
---------------------------- -------
BIGTABLE_ARCHIVE_HIGH1 8.49
结论2: insert select方式也不会压缩数据
使用create table方式灌入数据
create table BIGTABLE_ARCHIVE_HIGH2 compress for archive high as select * from BIGTABLE_NONE;
SEGMENT_NAME GB
--------------------------- -------
BIGTABLE_ARCHIVE_HIGH2 .22
结论3: create table 方式实现压缩!!
使用create table方式创建不同类型的HCC表
SEGMENT_NAME GB
--------------------------- --------
BIGTABLE_ARCHIVE_HIGH .219
BIGTABLE_ARCHIVE_LOW .297
BIGTABLE_QUERY_HIGH .336
BIGTABLE_QUERY_LOW .797
BIGTABLE_NONE 8.744
结论4: create不同类型的压缩表,
压缩率逐次升高
使用move方式对原始非压缩表进行压缩处理
因目标表是二级分区表,需要一个个分区做
alter table BIGTABLE_NONE move subpartition P201125_P1 compress for archive high;
alter table BIGTABLE_NONE move subpartition P201125_P2 compress for archive high;
alter table BIGTABLE_NONE move subpartition P201125_P3 compress for archive high;
alter table BIGTABLE_NONE move subpartition P201125_P4 compress for archive high;
...
move时带压缩参数,就算在同一个Tablespace执行,也需要消耗一定的时间
Elapsed: 00:01:33.71
Elapsed: 00:00:33.59
Elapsed: 00:00:52.51
Elapsed: 00:01:03.91
SEGMENT_NAME GB
---------------------------------------- ----------
BIGTABLE_ARCHIVE_HIGH .219
BIGTABLE_MOVE_COMPRESS .266
结论5: move也能进行一定的压缩,但压缩率没有 create table 方式高
综上所述,对于大的分区表,最优化的
压缩方法应该是
create table 方式
在前述的实际环境中,笔者使用了 archive high的方式,将原始表 576GB 压缩为 16.9 GB, 压缩比 39:1
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/78250/viewspace-1062080/,如需转载,请注明出处,否则将追究法律责任。