Oracle 12-提高插入性能

时间:2019-08-28 11:20:42

标签: oracle performance foreign-keys bulkinsert

我们正在迁移具有大量数据集(100个以上的表,其中许多是1000万个以上的记录)的旧项目。其中很少有庞大的公司(约1亿)。

切换应用程序时,我们将只有几个小时的时间将此数据迁移到具有相同表但结构略有不同(因此无法导入或抽取)的新应用程序中。

我们将插入以下记录:

  1. 创建了从源数据库到目标数据库的数据库链接
  2. 禁用目标表(和子表(如果有))上的所有约束
  3. 将所有索引更改为“不可用”
  4. 插入/ +追加NOLOGGING并行 / INTO destination_table SELECT / * +并行* /从source_table
  5. 重新建立所有索引(重新建立并行NOLOGGING,然后更改为NOPARALLEL和LOGGING)
  6. 启用目标表(和子表(如果有))上的所有约束

效果很好,但完成时间较长(大约5分钟,大约记录了1000万条记录)。大部分时间都花在STEP 6中,并且专门用于父子都很大的外键约束。

我们如何如上所述优化数据库的插入性能?

3 个答案:

答案 0 :(得分:2)

如果您正在寻找性能,那么在通过db_link传递数据时将会遇到问题。

将数据卸载到平面文件,然后设置外部表/ CTAS或SQL Loader将数据加载到新系统中。它会明显地更快。

A very small example showing the type of rates I was able to achieve on just a laptop and a VM.

TL / DR;

在Windows笔记本电脑上通过SQL Loader每秒

112,000行。

答案 1 :(得分:2)

很高兴收到不同的方法,但是我们将完善我们的方法(因为我们已经有了可行的解决方案)。有人说这可能不是“最佳”的方式,但可以解决我们在此特定情况下的担忧。

所以我们最终遵循的步骤是;

  1. 禁用目标表(和子表(如果有))上的所有约束
  2. 禁用目标表上的所有索引
  3. 增加序列缓存(如果使用的话)
  4. 执行INSERT(提示)和添加记录(选择并提示)
  5. 使用PARALLEL NOLOGGING重建目标表上的所有索引
  6. 更改索引以更改为NOPARALLEL&LOGGING
  7. 使用NOVALIDATE(和子表(如果有))启用所有约束
  8. ALTER TABLE TABLE_NAME 并行
  9. 使用VALIDATE启用所有约束
  10. ALTER TABLE TABLE_NAME NOPARALLEL

开头的脚本中的所有表都重复上述步骤

ALTER SESSION ENABLE PARALLEL DDL

  

表格: 99

     

记录: 593,960,688

     

花费时间: 01:23:44 小时

答案 2 :(得分:0)

如果您只有两个小时才能迁移一个大型项目,则可以执行以下操作:

  1. 在步骤4之后将数据设置为只读(可能为项目使用单独的表空间,然后执行alter tablespace new_stuff read only;
  2. 让用户进入应用程序。用户可以查看数据(可能直到第5步完成才慢慢查看)
  3. 完成步骤6后,将表空间更改为read write