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