【问题标题】:Quickly insert 24 million rows into Oracle快速将 2400 万行插入 Oracle
【发布时间】:2020-02-15 11:20:42
【问题描述】:

将 2400 万行插入 Oracle 中的表(来自同一个数据库表)中的最佳方法是什么?

目标表具有唯一且非空索引并且已分区。

【问题讨论】:

  • insert into .. select ... where ...
  • 这种方式加载 2400 万条记录需要 1 个多小时
  • 您可能想要使用数据泵实用程序。
  • 能否详细说明?
  • 嗯,需要一个多小时。如果这是一次性的(任务的性质表明它是一次性的)那么问题是什么?即使不是一次性的,它就像任何其他性能调整问题一样。你要搞清楚时间去哪儿了,第一步就是看执行计划。很有可能“超过一个小时”(超过多少?)是您可以期待的最好的……取决于您的硬件。

标签: sql oracle performance sql-insert


【解决方案1】:

插入大量行的最快方法是使用并行和直接路径写入:

alter session enable parallel dml;

insert /*+ append parallel */ into test1
select -a, b, c from test;

commit;

(您也许可以简单地使用负号来避免违反主键。ID 几乎总是正数,但通常没有规则阻止它们成为负数。)

此代码不仅仅是一个 FAST=TRUE 标志。您必须首先了解许多重要的注意事项。

并行性需要企业版(最昂贵的版本)、不差的硬件(多于一个内核和一个磁盘)和健全的配置(如果 DBA 设置参数 parallel_max_servers = 1,那么将没有并行可用线程)。并行性通常可以从其他进程中“窃取”——您可能需要 10 倍的系统资源才能仅提高 5 倍的性能。获得正确的并行度可能会很棘手。

Direct-path 直接写入数据文件,并避免写入 REDO 和 UNDO(用于恢复和一致性的额外数据)。这里的权衡是该语句将锁定整个表 - 没有其他人能够同时写入它。并且在下一次完整备份之前,该表将无法恢复。还有很多东西可以阻止直接路径写入,比如触发器、某些外键关系等。

仔细检查执行计划以确保您获得所有功能。您希望看到“LOAD AS SELECT”而不是“LOAD CONVENTIONAL”,以确保您获得直接路径写入。您会希望看到“PX”操作以确保您获得并行性。您需要在读取操作的写入部分上方都有一个“PX”。仔细检查注释部分,它可能会告诉您为什么没有得到您所要求的。

explain plan for
insert /*+ append parallel */ into test1
select * from test2;

select * from table(dbms_xplan.display);


Plan hash value: 1209398148

----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT                   |          |     1 |    39 |     2   (0)| 00:00:01 |        |      |            |
|   1 |  PX COORDINATOR                    |          |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)              | :TQ10000 |     1 |    39 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   3 |    LOAD AS SELECT (HYBRID TSM/HWMB)| TEST1    |       |       |            |          |  Q1,00 | PCWP |            |
|   4 |     OPTIMIZER STATISTICS GATHERING |          |     1 |    39 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR             |          |     1 |    39 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   6 |       TABLE ACCESS FULL            | TEST1    |     1 |    39 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
----------------------------------------------------------------------------------------------------------------------------

Note
-----
   - automatic DOP: Computed Degree of Parallelism is 2

这可能是很多工作!您可能会花费数小时优化单个 INSERT,并且可能需要阅读 Oracle 文档来解决一些问题。但是,如果您有耐心并拥有正确的配置,则可以看到 INSERT 性能的巨大改进。

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多