当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实际上是否作为批量加载工具执行?
我需要配置一些东西让它正常工作吗? (客户端/服务器设置等)
非常感谢任何帮助。
答案 0 :(得分:4)
我收到了Oracle产品经理Alex Keh的回复,称Oracle“也注意到了这个问题。我们正在评估如何解决这个问题。”
因此,在回答我自己的问题时,我猜OracleBulkCopy 不作为批量加载工具表现良好。至少现在不是。
我将把SQL * Loader包装为备用解决方案,因为错误修复没有ETA。
答案 1 :(得分:1)
使用DataTable作为源时是否也会出现此问题?或者仅仅是因为使用了IDataReader?