.net - 使用 .NET 批量插入到 Oracle

标签 .net sql oracle bulkinsert

使用 .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 中的表大小(同样应该在内部创建一个批处理)。
    最佳结果:
  • OracleBulkCopy:表大小 = 500,总持续时间 4'22"
  • OracleDataAdapter:表大小 = 100,总持续时间 3'03"

  • 为了比较:
  • SqlBulkCopy:表大小 = 1000,总持续时间 0'15"
  • SqlDataAdapter:表大小 = 1000,总持续时间 8'05"

  • 相同的客户端机器,测试服务器是 SQL Server 2008 R2。对于 SQL Server,大容量复制显然是最好的方法。它不仅总体上最快,而且服务器负载也低于使用数据适配器时。遗憾的是 OracleBulkCopy 不能提供完全相同的体验 - BulkCopy API 比 DataAdapter 更容易使用。

    关于.net - 使用 .NET 批量插入到 Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/343299/

    相关文章:

    c# - Windows 窗体中的事件顺序 'Form.Load' 、 'Form.Shown' 和 'Form.Activated'

    sql - 使用 Delphi XE3 如何获取 MS Access 中的表列表并排除 View /查询?

    sql - 使用 with 子句更新语句

    sql - Oracle SQL : Query results from previous X isoweeks () (where X might be > 52)

    c# - 企业框架日志记录 - ShouldLog 不适用于 SourceLevel 过滤器

    c# - NAudio WaveStream 和多 channel

    c# - Web 和 Winforms 的 .Net 身份验证

    mysql - 如何用MySQL删除列中的特殊字符?

    mysql - 为什么我无法删除此查询中不存在其他列的列?

    java - 无法启动ORACLE NOSQL数据库