C# OracleBulkCopy性能

C# OracleBulkCopy性能,c#,.net,oracle,bulk,C#,.net,Oracle,Bulk,我的C#.NET应用程序使用OracleBulkCopy将数百万条记录写入临时表。每次应用程序内存中有20000条或更多记录时,它都会调用OracleBulkCopy,在一个批中写入所有记录(我使用的批大小为0)。开始时,表是空的,只需2秒钟即可写入整个批处理。在此过程中,写入批处理的时间会增加。记录2.000.000次后,每次通话几乎需要25秒。我正在使用OracleBulkCopy的默认选项。做一些测试当表达到40.000.000时,写20.000条记录几乎需要3分钟 我想知道是否有任何建议

我的C#.NET应用程序使用OracleBulkCopy将数百万条记录写入临时表。每次应用程序内存中有20000条或更多记录时,它都会调用OracleBulkCopy,在一个批中写入所有记录(我使用的批大小为0)。开始时,表是空的,只需2秒钟即可写入整个批处理。在此过程中,写入批处理的时间会增加。记录2.000.000次后,每次通话几乎需要25秒。我正在使用OracleBulkCopy的默认选项。做一些测试当表达到40.000.000时,写20.000条记录几乎需要3分钟


我想知道是否有任何建议(我找不到任何关于它的建议),以便为每次通话保持几乎恒定的时间。我做错什么了吗?

看起来像是奇怪的行为。您是否跟踪了执行插入的数据库会话,以查看它在等待什么

ALTER SESSION SET timed_statistics=TRUE;
ALTER SESSION SET max_dump_file_size=UNLIMITED;
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';

100次中有99次,跟踪结果会指出这些奇怪的减速情况下的问题。

此表上有插入触发器吗?没有,没有。甚至连主键都没有。表被设置为不记录日志。“temp”表的确切含义是什么?全局临时表?临时表是指我们用来加载这些记录的表,这些记录随后使用insert from select插入到另一个表中。首先在这个空的“temp”表中插入比直接在最终表中插入要快。这不是一张临时桌子。这只是我们数据库的另一个表,我们使用它作为中介。问题是主键。我确信表是在没有主键的情况下创建的。使用跟踪文件,我们观察到主键上有数千次顺序读取。删除它会导致每批0.8秒的时间几乎不变。很高兴您找到了它,并且SQL跟踪发现了另一个问题。如果事情进展缓慢,SQL跟踪应该始终是第一件要尝试的事情。