Exadata 混合列壓縮實戰一例

青春狐狸發表於2013-12-03
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章