Adr*_*own 8 .net oracle odp.net sql-loader
当Oracle服务器在另一台机器上时,我发现OracleBulkCopy(ODP.NET)和SQL*Loader之间存在一些显着的性能差异.
我在Oracle中有一个非常基本的表,有三列(一个BINARY_FLOAT,两个NUMBER(18,0)).没有主键,索引,触发器等.它用作临时表以将批量数据传入DB.
SQL*Loader大约需要27秒才能将450万行加载到表中.
OracleBulkCopy大约需要10分钟才能加载100万行.
OracleBulkCopy,根据文档,*"...使用直接路径加载方法,它与Oracle SQL*Loader类似,但不一样."*在性能方面可能没有SQL*Loader ,但这种差异是荒谬的.
在对网络流量进行一些基本分析之后,我发现OracleBulkCopy正在发送和接收大量的小数据包.我使用Wireshark比较每个数据包,发现了一些有趣的结果.
SQL*Loader - 在初始连接握手之后 - 发送一系列8千字节数据包(TNS协议)并接收60字节的ACK作为响应.
OracleBulkCopy发送一系列102字节数据包(TNS协议)并接收133字节数据包(TNS协议)作为响应.什么......!?它就像是一次发送一行!
使用OracleBulkCopy类,我使用批量大小为100,000并使用自定义IDataReader从数据文件中读取.
所以,我的问题是:
有没有人见过这种行为?
OracleBulkCopy实际上是否作为批量加载工具执行?
有什么我需要配置,以使其正常工作?(客户端/服务器设置等)
任何帮助深表感谢.
我收到了 Oracle 产品经理 Alex Keh 的回复,称 Oracle“也注意到了这个问题。我们正在评估如何修复这个错误。”
因此,在回答我自己的问题时,我认为 OracleBulkCopy作为批量加载工具的性能不佳。至少目前不是。
我将封装 SQL*Loader 作为替代解决方案,因为错误修复没有预计到达时间。