如何有效地将数据插入索引丰富的 oracle db?
Posted
技术标签:
【中文标题】如何有效地将数据插入索引丰富的 oracle db?【英文标题】:How to efficiently insert data into index-rich oracle db? 【发布时间】:2009-04-27 19:19:21 【问题描述】:我们如何将大约 200 万行的数据插入到一个我们有许多索引的 oracle 数据库表中? 我知道一种选择是禁用索引然后插入数据。谁能告诉我其他选择是什么?
【问题讨论】:
我认为需要更多信息才能提供有意义的答案。如果 UNDO 的大小足够大,如果完成插入是 only 目标,这不是问题。您是否需要将插入作为单个事务来实现读取一致性/回滚?插入期间是否存在来自其他来源的表的并发 DML?应用程序的性质是否使得将其作为单个操作执行的时间令人望而却步? 我希望将数据插入单个事务中 【参考方案1】:按索引键顺序批量加载预排序数据
【讨论】:
【参考方案2】:查看SQL*Loader (尤其是关于performance optimization 的段落):它是Oracle 的标准批量加载实用程序,一旦您知道如何使用它(与Oracle 一样),它就会做得很好。
【讨论】:
【参考方案3】:固定de insert的技巧有很多,下面我写了一些
如果您使用 sequence.nextval 进行插入,请确保序列具有较大的缓存值(通常 1000 就足够了) 插入前先删除索引,然后再创建(确保在删除前获得索引的创建脚本)在创建时可以使用并行选项 如果目标表具有 fk 依赖关系,则在插入之前和插入之后再次启用它们。如果您确定您的数据可以使用 novalidate 选项(novalidate 选项对 oracle 有效,其他 rdbms 系统可能有类似的选项) 如果您选择并插入,您可以为 select 语句提供并行提示,对于插入,您可以使用附加提示 (direct-path insert)(直接路径插入概念对 oracle 有效,其他 rdbms 系统可能也有类似的选项)【讨论】:
【参考方案4】:不确定您是如何插入记录的;如果你可以的话;以较小的块插入数据。以我的经验,50 组 20k 记录通常比 1 x 1000000 快
确保您的数据库文件足够大,然后再开始在插入期间避免数据库增长...
【讨论】:
【参考方案5】:如果您确定数据,除了索引之外,您还可以禁用引用和约束检查。您还可以降低事务隔离级别。
不过,所有这些选项都是有代价的。每个选项都会增加您拥有损坏数据的风险,因为您最终可能会得到空 FK 等。
【讨论】:
【参考方案6】:作为另一种选择,可以使用 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 ..
【讨论】:
以上是关于如何有效地将数据插入索引丰富的 oracle db?的主要内容,如果未能解决你的问题,请参考以下文章