总结一下细节:我们需要将大约 500 万行暂存到供应商 (Oracle) 数据库中。使用 (ODP.NET) 批量处理 500k 行时,一切都很好OracleBulkCopy
,但是当我们尝试扩展到 5M 时,性能一旦达到 1M 标记就会开始缓慢爬行,随着更多行的加载而逐渐变慢,最终3小时左右后超时。
我怀疑它与桌子上的主键有关,但我一直在搜索 Oracle 论坛和 Stack Overflow 以获取信息,而且我正在阅读的很多内容都与此相矛盾(而且,很多帖子似乎相互矛盾) . 我希望有人可以直接记录有关该过程的一些密切相关的问题:
该类是否
OracleBulkCopy
使用常规或直接路径加载?有什么方法可以证实这一点,一种或另一种?假设它确实使用直接路径加载:Oracle 是否会在加载期间自动将所有索引设置为不可用并在之后将它们重新联机?我已经阅读了几篇关于此的声明,但再次无法确认。
如果 #2 为真,那么在我启动大容量复制操作之前,表上的索引是否应该有所不同?如果是这样,为什么?
与#3相关,一般来说,在使用不可用索引的批量加载与在加载之前实际删除索引并在之后重新创建索引之间是否有任何实际区别?
如果 #2不正确,或者如果有一些我不理解的警告,那么在批量加载之前显式使索引不可用,然后 显式重建它会有什么不同吗?
随着越来越多的记录被添加,除了索引构建之外,还有什么其他可能导致批量复制操作逐渐变慢的吗?(也许与日志记录有关,尽管我希望不会记录批量操作?)
如果除了首先删除 PK/index 之外真的没有其他方法可以让性能达到最佳状态,我可以采取哪些步骤来确保索引不会完全消失,即如果与数据库的连接丢失过程的中间?