在 WAN 上具有许多绑定变量的 oracle 插入非常慢
Posted
技术标签:
【中文标题】在 WAN 上具有许多绑定变量的 oracle 插入非常慢【英文标题】:oracle insert with many bind variables over WAN is very slow 【发布时间】:2009-05-27 14:08:45 【问题描述】:我们遇到了使用 40 个绑定变量作为列值的慢速插入语句的问题。它在 WAN 链接上运行时会运行几秒钟,我们无法确定问题,直到我们使用网络分析器。这个准备好的查询的每次执行都需要在客户端和服务器之间交换超过 120 个数据包才能完成。我们可以做些什么来更有效地执行它?
当我从同一主机使用实际参数(不带绑定变量)运行相同的插入时,它会在几十毫秒内完成。参数没什么特别的,只有短的varchars和数字。
我们正在使用带有 ODAC 的 Delphi 6,我们尝试了各种版本的 ODAC 和 Oracle 客户端,但均无济于事。在服务器端,我们尝试了 Oracle 10 和 11。
【问题讨论】:
【参考方案1】:TNS
并非设计为在 WAN
上运行良好。
如果可能,重写您的应用程序以使用其他网络层,例如HTTP
,这样更有效。
例如,您可以使用Oracle HTTP Server
来实现。
【讨论】:
即使在 LAN 上,最好有一些选项不为每个单独的绑定访问服务器,而是在执行查询时批量执行此操作。当然,错误处理语义会有点不同,但仍然...... 事实上,如果每次绑定都到服务器,那岂不是完全否定了批处理查询的想法(主要的性能改进来自于消除服务器往返)? 完全改变网络堆栈是不可接受的。因为插入的数据来源于文本文件,我们正在考虑使用 SQL Loader 来代替。但是,如果我们能够在不中断代码更改的情况下提高性能,我们会更高兴。 我们实际上最终使用 SQL*Loader 重写了插入例程(无论如何它都急需改进),现在它就像魅力一样工作。【参考方案2】:你看过External Tables吗?取代了对 SQL Loader 的需求 不过需要 Oracle 9i 或更高版本
【讨论】:
但无法通过网络访问外部表(仅在使用网络文件系统/共享、远程桌面等更复杂的情况时)。 能否通过广域网将数据移动到数据库服务器,然后上传? 是的,但是如何移动数据?您需要首先在服务器和每个客户端上配置远程桌面或文件共享。你有没有做过系统/网络管理员,你知道这样的事情是什么意思吗?只需为每个人部署 sqlldr.exe + 更新的应用程序对我们来说要容易得多,因为服务器上几乎不需要更改,客户端上也不需要额外的配置。实际上我们很幸运,只有少数用户需要此功能,并且他们已经使用远程桌面,因此最终解决方案可以推迟。 伙计——我不知道你的架构是什么,你还没有描述它。我只问了一个问题——没必要发疯。以上是关于在 WAN 上具有许多绑定变量的 oracle 插入非常慢的主要内容,如果未能解决你的问题,请参考以下文章