【问题标题】:OracleBulkCopy vs SQL*Loader PerformanceOracleBulkCopy 与 SQL*Loader 性能对比
【发布时间】:2012-02-17 20:59:28
【问题描述】:

当 Oracle 服务器位于另一台计算机上时,我发现 OracleBulkCopy (ODP.NET) 和 SQL*Loader 之间存在一些显着的性能差异。

我在 Oracle 中有一个非常基本的表,其中包含三列(一个 BINARY_FLOAT,两个 NUMBER(18,0))。没有主键、索引、触发器等。它被用作一个临时表,将批量数据获取到数据库中。

SQL*Loader 将 450 万行加载到表中大约需要 27 秒。

OracleBulkCopy 仅加载 100 万行大约需要 10 分钟。

OracleBulkCopy,根据文档,*"...使用直接路径加载方法,这与 Oracle SQL*Loader 相似但不同。"* 它可能与 SQL*Loader 不一样就性能而言,但这种差异是荒谬的。

在对网络流量进行一些基本分析后,我发现 OracleBulkCopy 正在发送和接收大量小数据包。我使用 Wireshark 比较了每个数据包,发现了一些有趣的结果。

SQL*Loader - 在初始连接握手之后 - 发送一系列 8 KB 数据包(TNS 协议)并接收 60 字节 ACK 作为响应。

OracleBulkCopy 发送一系列 102 字节 数据包(TNS 协议)并接收一个 133 字节 数据包(TNS 协议)作为响应。什么……!?就像是一次发送一行!

对于 OracleBulkCopy 类,我使用 100,000 的批处理大小并使用自定义 IDataReader 从数据文件中读取。

所以,我的问题是:

  • 有人见过这种行为吗?

  • OracleBulkCopy 真的可以作为批量加​​载工具执行吗?

  • 是否需要进行一些配置才能使其正常工作? (客户端/服务器设置等)

非常感谢任何帮助。

【问题讨论】:

  • 我使用数据表的插入时间相似。更糟糕的是,有几列是时间戳类型,因此我必须将数据表列设置为 OracleTimeStamp 类型,这在我分析应用程序时似乎也受到了很好的影响。您是否能够加快批量复制速度?弹出到命令行运行 sqlloader 似乎是在 Web 服务器上处理大文件的一种非常糟糕的方式!

标签: .net oracle odp.net sql-loader


【解决方案1】:

我收到了 Oracle 产品经理 Alex Keh 的回复,称 Oracle“也注意到了这个问题。我们正在评估如何修复这个错误。”

所以在回答我自己的问题时,我猜 OracleBulkCopy 确实作为批量加​​载工具表现良好。至少目前没有。

我将包装 SQL*Loader 作为替代解决方案,因为该错误修复没有 ETA。

【讨论】:

  • 出于好奇,你试过array binding吗?
  • 是的,我们使用数组绑定来加载大部分数据。然而,在这个特定的例子中,我们将数千万行数据加载到数据库中,我们不需要围绕它进行大量逻辑 - 只是快速加载和数组绑定还不够快。
  • @AdrianBrown - 如果您仍在监视此线程,您还记得哪个版本以及错误修复的更新在哪里?
  • @Leigh - 抱歉,我不记得哪个版本了。终于等不及了,不知道bug修复了没有。无论如何,我们最终还是迁移到了 SQL Server,但出于完全不同的原因。 :)
  • @AdrianBrown - 没问题,那是很久以前的事了。感谢您回复我!
猜你喜欢
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 2021-04-10
  • 2011-09-22
  • 2012-02-07
  • 2018-06-29
相关资源
最近更新 更多