非分割槽表遷移到分割槽表
這幾周DW部分common表重新整理速度很慢,經分析是資料量過大,這兩天都在想優化的方式,定下來從分割槽入手。
目前ODS通過kettle同步過來的資料都是非分割槽的,部分大表都在2億以上,分割槽迫在眉睫。
先是從我常用的一個common表入手,之前計劃對常用的欄位如狀態、建立時間做list-range分割槽,但考慮到狀態變化會導致分割槽鍵變化,後決定只使用建立時間做range分割槽,並且對已有的資料按照資料分佈先生成部分分割槽,然後按照interval 1天或是7天自動建立分割槽。
表結構定義(15年之前同一分割槽,15年之後每月一個分割槽,16之後每7天一個分割槽)
CREATE TABLE TABLE_NAME
(C1 DATE,
C2 NUMBER,
…)
PARTITION BY RANGE(C1)
INTERVAL (NUMTODSINTERVAL(7,’DAY’))
(
PARTITION P2014 LESS THAN(TO_DATE(‘2015-01-01 00:00:00’,’YYYY-MM-DD HH24:MI:SS’)),
PARTITION P201501 LESS THAN(TO_DATE(‘2015-02-01 00:00:00’,’YYYY-MM-DD HH24:MI:SS’)),
…….
PARTITION P20151231 LESS THAN(TO_DATE(‘2016-01-01 00:00:00’,’YYYY-MM-DD HH24:MI:SS’)),
PARTITION P20160107 LESS THAN(TO_DATE(‘2016-01-01 00:00:00’,’YYYY-MM-DD HH24:MI:SS’))
);
表定義之後,就是資料遷移了,非分割槽表到分割槽表有多種方式,
線上方式主要通過dbms_redefinition實現
離線方式包括:
1.直接insert
2.exp/imp
3.exchange partition
我主要測了1、3兩種方式,
其中第3種交換分割槽方式,我先建了分割槽表,只包含一個分割槽,並且自動分割槽定義是在資料交換後再單獨定義,速度很快,但有兩個問題
1.非分割槽交換到分割槽表,只能交換到一個目標分割槽中,所以還額外執行split partition,然後再定義自動增加分割槽
alter table table_name set interval (NUMTODSINTERVAL(7,’DAY’));
2.分割槽交換後,源表成空表,沒有資料
由於遷表過程中,涉及到split部分會消耗一點時間,對應用有影響,所以放棄第3種方式,採用傳統的先insert 到一箇中間表(已分割槽),然後再重新命名,建立索引等,校驗資料後,drop源表