当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实际上是否作为批量加载工具执行?
有什么我需要配置,以使其正常工作?(客户端/服务器设置等)
任何帮助深表感谢.