Exadata 混合列压缩实战一例

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/78250/viewspace-1062080/

你可能感兴趣的:(数据库)