2016-09-07 54 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 */ 如果你有资源并且你正在寻求加速插入,你可能也希望采用一些并行。