Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用大容量插入在oracle中的表之间移动大数据_Sql_Oracle_Plsql_Oracle11g_Bulkinsert - Fatal编程技术网

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

Sql 使用大容量插入在oracle中的表之间移动大数据,sql,oracle,plsql,oracle11g,bulkinsert,Sql,Oracle,Plsql,Oracle11g,Bulkinsert,我想将100万行数据移动到另一个表中。Im使用查询: insert into Table1 select * from Table2; 在我的PL/SQL函数中。但是这条路太慢了 如何使用批量插入方法执行此操作 源表和目标表具有相同的结构 表具有哈希分区和1个索引 忘记批量插入。因为insert into select是您可以加载的最佳批量。 最快的方法是禁用索引(将其标记为不可用),并在一次操作中执行此操作 插入: 并使用不可恢复(甚至可能是并行)重建索引 PS:如果表已分区(源和目标,甚

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

insert into Table1
select * from Table2;
在我的PL/SQL函数中。但是这条路太慢了

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

  • 源表和目标表具有相同的结构

  • 表具有哈希分区和1个索引

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

      并使用不可恢复(甚至可能是并行)重建索引

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

      跟进:

      检查以下选项的性能

      SELECT    /*+ PARALLEL(A 4)
                  USE_HASH(A) ORDERED */
            YOUR_COLS
      FROM
            YOUR_TABLE A
      WHERE
            ALL_CONDITIONS;
      
      如果更快的话

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

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

      并使用不可恢复(甚至可能是并行)重建索引

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

      跟进:

      检查以下选项的性能

      SELECT    /*+ PARALLEL(A 4)
                  USE_HASH(A) ORDERED */
            YOUR_COLS
      FROM
            YOUR_TABLE A
      WHERE
            ALL_CONDITIONS;
      
      如果更快的话

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


      在插入过程中是否禁用了目标表上的约束和索引?没有。我需要吗?逐行更新索引要比以后重建索引慢得多。@Klas谢谢。禁用和启用索引时,Im出现错误。ORA-14086:分区索引不能重建为一个完整的替换索引PK_SUBS_FREE不可用;然后,改变索引PK_SUBS_自由重建;在插入过程中是否禁用了目标表上的约束和索引?没有。我需要吗?逐行更新索引要比以后重建索引慢得多。@Klas谢谢。禁用和启用索引时,Im出现错误。ORA-14086:分区索引不能重建为一个完整的替换索引PK_SUBS_FREE不可用;然后,改变索引PK_SUBS_自由重建;表具有哈希分区和1个索引。如何执行并行插入。请记住,如果将新表写入新创建的表空间,则不会有很大的改进。因为在APPEND中没有使用新的TBS。我同意单次插入是可行的。而且,使用可能会显著提高性能(但请记住,在下次备份之前,您的数据是无法恢复的!)。应该使用NOLOGGING,而不是不推荐使用的不可恢复的,并行性不需要分区,并且使用散列和有序提示不会起任何作用。@jonearles我同意NOLOGGING。但为了使用散列,我尝试在所有并行选择上传播等量的数据。你确定它不起作用吗?用于强制哈希连接。如果SELECT实际上只有一个表,那么就没有join方法。Oracle将自动尝试通过块范围颗粒均匀分布数据。表具有哈希分区和1个索引。如何执行并行插入。请记住,如果将新表写入新创建的表空间,则不会有很大的改进。因为在APPEND中没有使用新的TBS。我同意单次插入是可行的。而且,使用可能会显著提高性能(但请记住,在下次备份之前,您的数据是无法恢复的!)。应该使用NOLOGGING,而不是不推荐使用的不可恢复的,并行性不需要分区,并且使用散列和有序提示不会起任何作用。@jonearles我同意NOLOGGING。但为了使用散列,我尝试在所有并行选择上传播等量的数据。你确定它不起作用吗?用于强制哈希连接。如果SELECT实际上只有一个表,那么就没有join方法。Oracle将自动尝试通过块范围颗粒均匀分布数据。