使用 .NET 对 Oracle 进行批量插入的最快方法是什么?我需要使用 .NET 将大约 160K 记录传输到 Oracle。目前,我正在使用插入语句并执行 160K 次。大约需要 25 分钟才能完成。作为从另一个数据库(MySQL)查询的结果,源数据存储在 DataTable 中,
有没有更好的方法来做到这一点?
编辑 :我目前正在使用 System.Data.OracleClient,但愿意接受使用其他提供商(ODP.NET、DevArt 等)的解决方案
最佳答案
SQL Server 的 SQLBulkCopy 速度非常快。不幸的是,我发现 OracleBulkCopy 慢得多。它也有问题:
使用 OracleBulkCopy。如果发生主键冲突,ORA-26026
被提出,它似乎是不可恢复的。试图重建
索引无济于事,并且表上的任何后续插入都失败,
也正常插入。
OracleBulkCopy 有时会卡在 WriteToServer 中。问题
似乎取决于批量大小。在我的测试数据中,问题会
当我重复时,发生在我的测试中完全相同的时间点。用一个
更大或更小的批量大小,并且不会发生问题。我懂了
大批量的速度更不规则,这点
与内存管理相关的问题。
实际上 System.Data.OracleClient.OracleDataAdapter 比 OracleBulkCopy 更快,如果你想用小记录但很多行填充一个表。您需要调整批处理大小,OracleDataAdapter 的最佳 BatchSize 小于 OracleBulkCopy。
我在具有 x86 可执行文件和 32 位 ODP.Net 客户端 2.112.1.0 的 Windows 7 机器上运行了我的测试。 . OracleDataAdapter 是 System.Data.OracleClient 2.0.0.0 的一部分。我的测试集大约有 600,000 行,最大记录大小。 102 字节(平均大小 43 个字符)。数据源是一个 25 MB 的文本文件,以流的形式逐行读取。
在我的测试中,我将输入数据表构建为固定的表大小,然后使用 OracleBulkCopy 或 OracleDataAdapter 将数据 block 复制到服务器。我在 OracleBulkCopy 中将 BatchSize 保留为 0(以便将当前表内容作为一个批处理复制)并将其设置为 OracleDataAdapter 中的表大小(同样应该在内部创建一个批处理)。
最佳结果:
为了比较:
相同的客户端机器,测试服务器是 SQL Server 2008 R2。对于 SQL Server,大容量复制显然是最好的方法。它不仅总体上最快,而且服务器负载也低于使用数据适配器时。遗憾的是 OracleBulkCopy 不能提供完全相同的体验 - BulkCopy API 比 DataAdapter 更容易使用。
关于.net - 使用 .NET 批量插入到 Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/343299/