【发布时间】: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