OracleBulkCopy与SQL * Loader性能

时间:2012-02-02 02:30:20

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

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

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

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

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

OracleBulkCopy,根据文档,*“...使用直接路径加载方法,它与Oracle SQL * Loader类似,但不一样。”*它可能不适用于SQL * Loader in表现方面,但这种差异是荒谬的。

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

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

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

使用OracleBulkCopy类,我使用批量大小为100,000并使用自定义 IDataReader 从数据文件中读取。

所以,我的问题是:

  • 有没有人见过这种行为?

  • OracleBulkCopy实际上是否作为批量加​​载工具执行?

  • 我需要配置一些东西让它正常工作吗? (客户端/服务器设置等)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

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

因此,在回答我自己的问题时,我猜OracleBulkCopy 作为批量加​​载工具表现良好。至少现在不是。

我将把SQL * Loader包装为备用解决方案,因为错误修复没有ETA。

答案 1 :(得分:1)

使用DataTable作为源时是否也会出现此问题?或者仅仅是因为使用了IDataReader?