【发布时间】: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