【问题标题】:Oracle Performance: Partition Split vs Insert AppendOracle 性能:分区拆分与插入追加
【发布时间】: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


【解决方案1】:

有一个快速拆分优化,具体取决于具体情况。但是根据您的描述,我会简单地执行 INSERT /+* APPEND */ 如果您有资源并且希望加快插入速度,您可能还想使用一些并行性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-03
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多