我目前正在重构Oracle 12c中的数据加载过程,并正在探索分区作为解决方案。我的数据按日期分类,每个日期我有~500k的记录,似乎符合分区的“最小最佳”,或者我被告知。最初的计划是使用临时表来加载数据,然后将虚拟分区添加到主表并执行分区交换。但是,我的数据加载包含几天而不是一天的数据。初步研究表明有两种方法可以解决这个问题:
选项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 * / 如果你有资源并且想要加速插入,你可能也希望使用一些并行性。