【发布时间】:2017-01-07 01:38:05
【问题描述】:
我目前正在重构 Oracle 12c 中的数据加载过程,并正在探索将分区作为解决方案。我的数据按日期分类,每个日期我有大约 50 万条记录,这似乎符合分区的“最小最优”,或者我被告知。最初的计划是使用 staging 表来加载数据,然后在主表中添加一个虚拟分区并执行分区交换。但是,我的数据加载包含几天而不是一天的数据。初步研究表明有两种方法可以解决这个问题:
方案一:执行分区交换,然后循环拆分大分区
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;
不知何故,拆分分区似乎比插入要慢。这是预期的行为还是我遗漏了什么?
【问题讨论】:
-
您需要使用临时表吗?不能直接插入主分区表吗?
标签: oracle bulkinsert database-partitioning