如何有效地将数据插入到索引丰富的oracle db中?

时间:2009-04-27 19:19:22

标签: sql oracle performance

我们如何将大约200万行的数据插入到我们有多个索引的oracle数据库表中? 我知道一个选项是禁用索引然后插入数据。任何人都可以告诉我其他选项是什么?

6 个答案:

答案 0 :(得分:1)

按索引键顺序预分类数据的批量加载

答案 1 :(得分:1)

检查SQL*Loader(特别是关于performance optimization的段落):它是Oracle的标准批量加载实用程序,一旦您知道如何使用它就会很好(就像Oracle一样)。

答案 2 :(得分:1)

有许多技巧可以加入插入,下面我写了一些

  • 如果使用sequence.nextval进行插入,请确保序列具有较大的缓存值(通常足够1000)
  • 在插入之前删除索引并在之后创建(确保在删除之前获取索引的创建脚本),同时创建可以使用并行选项
  • 如果目标表具有fk依赖项,则在插入之前和再次插入启用之后禁用它们。如果您确定数据,可以使用 novalidate 选项(novalidate选项对 oracle 有效,其他rdbms系统可能有类似的选项)
  • 如果您选择并插入,您可以为select语句提供并行提示,对于插入,您可以使用append提示(直接路径插入)(直接路径插入概念对 oracle有效,其他rdbms系统可能有类似的选项)

答案 3 :(得分:0)

不确定如何插入记录;如果你可以的话;将数据插入较小的块中。根据我的经验,50组20k记录通常比1 x 1000000快。

确保数据库文件足够大,然后才能在插入过程中开始保存数据库增长...

答案 4 :(得分:0)

如果您确定数据,除索引外,您可以禁用参照和约束检查。您还可以降低事务隔离级别。

但是,所有这些选项都需要付出代价。每个选项都会增加您拥有损坏数据的风险,因为您可能最终得到零FK等。

答案 5 :(得分:0)

作为另一种选择,可以使用oracle高级和更快的数据泵(expdp,impdp)实用程序可用性10 G向前。尽管如此,Oracle仍然支持旧的导出/导入(exp,imp)。

Oracle为我们提供了许多数据加载选择,比某些选择更快:

  • Oracle10数据泵Oracle导入实用程序
  • SQL插入和合并
  • 语句用于forall PL / SQL运算符的PL / SQL批量加载
  • SQL *装载机

The pros/cons of each can be found here ..