2016-09-07 28 views
0

我目前正在重構Oracle 12c中的數據加載過程,並且正在探索將分區作爲解決方案。我的數據按日期分類,每個日期我有約500k條記錄,似乎符合分區的「最低優化」,或者我被告知。最初的計劃是使用登臺表來加載數據,然後在主表中添加一個虛擬分區並執行分區交換。但是,我的數據加載包含來自幾天的數據,而不是一天之內的數據。初步研究表明,有兩種方法來解決這個問題:Oracle性能:分區拆分vs插入追加

選項1:執行分區交換,然後在循環中拆分大分區

ALTER TABLE MAIN_TABLE ADD PARTITION DUMMY_PARTITION VALUES LESS THAN (TO_DATE('1-1-9999', 'DD-MM-YYYY')); 

ALTER TABLE MAIN_TABLE 
EXCHANGE PARTITION DUMMY_PARTITION 
WITH TABLE STAGING_TABLE 
WITHOUT VALIDATION UPDATE GLOBAL INDEXES; 

BEGIN 
    FOR row IN (select distinct to_char(DATE_FIELD+1, 'YYYYMMDD') DATE_FIELD from PARTITIONED_TABLE order by DATE_FIELD) 
    LOOP 
     EXECUTE IMMEDIATE 'ALTER TABLE MAIN_TABLE SPLIT PARTITION DUMMY_PARTITION AT (TO_DATE('''||row.DATE_FIELD||''', ''YYYYMMDD'')) INTO (PARTITION p'||row.DATE_FIELD||', PARTITION DUMMY_PARTITION) UPDATE GLOBAL INDEXES'; 
    END LOOP; 
END; 
/

選項2:執行插入附加

INSERT /*+ append */ INTO MAIN_TABLE SELECT * FROM STAGING_TABLE; 

不知何故,看起來分裂分區是一個比插入更慢的過程。這是預期的行爲還是我錯過了什麼?

+0

您是否需要使用臨時表?你不能直接插入主分區表嗎? –

回答

0

根據具體情況,有一個快速拆分優化。但是根據你的描述,我只是簡單地執行INSERT/+ * APPEND */ 如果你有資源並且你正在尋求加速插入,你可能也希望採用一些並行。