【问题标题】:Oracle Table LOGGING Mode - Bulk data insertionOracle Table LOGGING 模式 - 批量数据插入
【发布时间】:2018-08-26 01:16:29
【问题描述】:

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

  1. Table1 有 20 亿行。
  2. Table2 是一个新表,与 Table1 相同。
  3. Table1 和 Table2 都是 List 分区类型。
  4. 两个表必须在同一个表空间中,并且表空间是用 LOGGING 模式创建的。
  5. TABLESPACE 块大小为:8192,FORCE_LOGGING NO,AUTO EXTEND ON。启用重做存档

所以,这就是我进行此活动的方法,我要求提供建议以改进或防止一些突然出现的不需要的情况。

  1. 创建具有相同结构的 Table2,没有任何索引或 PK。
  2. 更改表 2 不记录; -- 将表置于 NOLOGGING 模式以停止重做生成。这样做只是为了提高性能。
  3. 在 50 个并行作业中执行此活动(基于分区列创建的作业)。分区列有 120 个不同的值。所以总共有120个工作。前 50 个将被发布,1 个完成后,第 51 个将被发布,依此类推。
  4. 使用游标,批量获取,限制为 5000,FORALL 用于插入(带有 APPEND 提示)。 1 次迭代后立即提交,因此提交频率为 5000。
  5. 所有作业完成后,将 Table2 重新置于 LOGGING 模式。 更改表 Table2 日志记录;
  6. 在启用并行模式的 Table2 上创建所有必需的索引和 PK,然后更改索引 NOPARALLEL。

有什么建议吗?非常感谢您的宝贵时间。

【问题讨论】:

  • 第一个建议 - 将此问题提交给dba.stackexchange.com,因为它在这里是题外话。第二个建议,正确配置为利用可用硬件并行性的数据库服务器不需要执行 50 个并行作业。让所有精美的 Oracle 数据库服务器软件为您完成并行工作。
  • @MichaelO'Neill 这个问题是关于编程的,不是题外话。在某些组织中,应用程序 DBA 会执行此类任务,但在许多组织中,操作 DBA 不知道如何执行此操作。但我同意你关于让 Oracle 完成并行工作的观点。

标签: sql oracle plsql


【解决方案1】:

使用单个 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);

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

【讨论】:

    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 2022-01-20
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多