使用批量插入在 oracle 中的表之间移动大数据

Jac*_*ack 3 sql oracle plsql bulkinsert oracle11g

我想将 100 万行数据移动到另一个表。我使用查询:

insert into Table1
select * from Table2;
Run Code Online (Sandbox Code Playgroud)

在我的 PL/SQL 函数中。但是这种方式太慢了。

如何使用批量插入方法执行此操作?

  • 源表和目标表具有相同的结构。
  • 表具有哈希分区和 1 个索引。

Sri*_*niV 5

忘记批量插入。因为 insert into select 是您可以加载的最佳批量。最快的方法是禁用索引(将它们标记为不可用)并在单个插入中执行此操作:

insert /*+ append */ into TARGET
select COLS
  from SOURCE;

commit;
Run Code Online (Sandbox Code Playgroud)

并使用 UNRECOVERABLE(甚至可能是并行的)重建索引。

PS:如果表是分区的(源和目标都可以,甚至可以使用并行插入)

跟进:

检查以下选择的性能

SELECT    /*+ PARALLEL(A 4)
            USE_HASH(A) ORDERED */
      YOUR_COLS
FROM
      YOUR_TABLE A
WHERE
      ALL_CONDITIONS;
Run Code Online (Sandbox Code Playgroud)

如果再快一点

INSERT   /*+ APPEND */
     INTO
      TARGET
    SELECT /*+ PARALLEL(A 4)
            USE_HASH(A) ORDERED */
          YOUR_COLS
    FROM
          YOUR_TABLE A
    WHERE
          ALL_CONDITIONS;
Run Code Online (Sandbox Code Playgroud)

  • 我同意单个插入是要走的路。并且使用 [direct-path inserts](http://docs.oracle.com/cd/E11882_01/server.112/e25494/tables.htm#ADMIN01509) 可能会显着提高性能(但请记住,您的数据直到下一个备份!)。应该使用 NOLOGGING 而不是已弃用的 UNRECOVERABLE,并行不需要分区,USE_HASH 和 ORDERED 提示不会做任何事情。 (3认同)