【问题标题】:Bulk Insert performance in OracleOracle 中的批量插入性能
【发布时间】:2012-04-02 03:41:21
【问题描述】:

我尝试了很多解决方案,但我仍然不明白:我有一个简单的插入(有 40 列不同类型(包括 blob),我尝试插入这种数据传递(我使用来自 c# 的 Odac)每个参数的值数组。

结果是一次调用 ExecuteNonQuery 或多或少 4000 行,问题是这个插入没有那么多元素持续 3 小时。

有什么建议吗?数据源来自软件,因此无法在 db 上链接,它的内存数据和我所做的只是将它们放入数组并将它们作为我的 oraclecommand 的输入参数传递,然后我运行。

在这种情况下使用存储过程会有什么不同吗?为什么?

插入实际上是在一个事务中,但我尝试插入的表中根本没有索引,数据库是常规安装的具有 100 个表的 Oracle XE,事务仅包括此插入和其他一些不太大的操作. 我尝试插入的总数据最大为 100 Mb...我不知道我应该再次检查什么:(

再次重申:事务似乎不会影响性能,而且速度不是线性的,即 1000 个元素 = 10 分钟,4000 个元素 = 3 小时.. 全部使用 100% 的 cpu 和大量的内存

【问题讨论】:

  • 愿意发布您的尝试,以便我们消除/调查解决方案和原因吗?
  • 一些可能性:1. 每次插入后需要更新的复杂/许多索引(考虑在插入期间禁用 + 之后重新创建)2. 在每个插入行后触发的 on-insert 触发器跨度>
  • 您是否在进行交易?例如 => OracleTransaction trans ... cmd.ExecuteNonQuery(); trans.Commit(); trans.Dispose();该过程是否正在提交?
  • 谢谢,在帖子的末尾有更多的细节,但实际上没有索引,没有复杂的情况......只是想知道没有交易来检查是否有问题,但当然我真的需要交易现实世界...
  • 另一个信息:在这个过程中似乎关键的方面是CPU,它在插入查询的执行过程中一直100%

标签: c# oracle bulkinsert odac


【解决方案1】:

插入 4,000 行需要 3 个小时?那是问题吗?除非每一行都是几 GB 长,否则没有真正的理由来表现这种性能 - 您需要查看数据库(或让您的 DBA 执行),而不是您的 C# 代码。

【讨论】:

  • 他的斑点可能很大。转移可能需要很长时间。
  • 谢谢,但实际上数据库是一个普通的 oracle XE(版本 10),没有任何问题......我应该检查您对数据库的看法吗?
猜你喜欢
  • 2013-07-12
  • 2011-02-28
  • 2014-09-17
  • 2012-01-28
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多