Oracle Table LOGGING模式 - 批量数据插入

时间:2018-03-16 21:26:57

标签: sql oracle plsql

我有一个场景,我需要从Table1到Table2复制5亿行。几点,

  1. 表1有20亿行。
  2. 表2是一个新表,与表1相同。
  3. Table1和Table2都是List分区类型。
  4. 两个表必须位于同一个表空间中,并且使用LOGGING模式创建表空间。
  5. TABLESPACE块大小为:8192,FORCE_LOGGING NO,AUTO EXTEND ON。 REDO ARCHIVAL ENABLED
  6. 所以,这是我做这项活动的方法,我要求提出建议,以改善或预防一些突如其来的不良情况。

    1. 创建具有相同结构的Table2,没有任何索引或PK。
    2. Alter Table2 nologging; - 在NOLOGGING模式下放置表以停止重做生成。这样做只是为了提高性能。
    3. 在50个并行作业中执行此活动(基于分区列创建的作业)。分区列有120个不同的值。共有120个工作岗位。将发布前50个,一旦完成,将发布第51个,依此类推。
    4. 使用光标,限制为5000的批量提取和插入的FORALL(使用APPEND提示)。在1次迭代后立即提交,因此提交freq为5000.
    5. 完成所有作业后,将Table2重新置于LOGGING模式。 alter table Table2 logging;
    6. 在启用了并行模式的情况下,在Table2上创建所有必需的索引和PK,然后更改索引NOPARALLEL。
    7. 有什么建议吗?非常感谢你的时间。

1 个答案:

答案 0 :(得分:2)

使用单个SELECT语句而不是PL / SQL。

不需要提交块或提供镜像分区的并行策略。如果APPEND提示有效且使用直接路径写入,则不会有任何重要的REDO或UNDO使用,因此您不需要运行块来减少资源消耗。 Oracle可以轻松地将一个段划分为粒子 - 它只是将一堆块从一个地方复制到另一个地方,如果它按处理它们分区并不重要。 (一些可能的例外情况是,如果您使用的是不支持并行SQL的奇怪列,或者您正在连接表并使用分区智能联接。)

alter session enable parallel dml;

alter table table2 nologging;

--Picking a good DOP can be tricky.  32 might not be the best number for you.
insert /*+ append parallel(32) */ into table2
select * from table1;

commit;

alter table table2 logging;

在运行此操作之前,请检查执行计划。有很多东西可以阻止直接路径写入,并且您希望在启动DML之前找到它们。

在执行计划中,确保您看到“LOAD AS SELECT”以确保直接路径写入,“PX”确保并行性,并在“LOAD AS SELECT”之前执行“PX”操作以确保两个写入并且读取是并行完成的。

alter session enable parallel dml;

alter table table2 nologging;

explain plan for
insert /*+ append parallel(32) */ into table2
select * from table1;

select * from table(dbms_xplan.display);

我经常发现单独处理索引是不值得的。但这可能取决于索引的数量。