通过 *** 的 Oracle 和 MS SQL 查询非常慢

Posted

技术标签:

【中文标题】通过 *** 的 Oracle 和 MS SQL 查询非常慢【英文标题】:Oracle and MS SQL Query very slow over *** 【发布时间】:2020-04-04 18:04:12 【问题描述】:

我有一个将Oracle Driver 用于 Oracle Database 12c 企业版 12.1.0.2.0 64 位的 C# 程序。 在 LAN 上,程序中的选择大约需要 2 秒。如果我通过 *** 隧道建立连接,则相同的选择大约需要 48 秒。 如果我 ping 数据库: 局域网:0.206 毫秒 ***:53 毫秒

为了确保我也使用 Oracle SQL Developer 19.2.1 进行了测试,结果大致相同。

我尝试在客户端将 MTU 降低到 1400,因为一些网站提到碎片是问题的原因,但这并没有改变任何东西,至少在我配置它的方式上。这可能是什么原因造成的?

【问题讨论】:

您的对象有多大,选择了多少?这可能是带宽问题。另外,你用的是什么***?您是在内部托管自己的还是公共/商业的? 我不太清楚你所说的对象是什么意思?我选择了 14 个字段,结果大约有 52K 行。我们使用 Open***。我的 GUI 版本是 11.10.0.0,服务器位于内部。在日志中显示 Open*** 2.4.6 x86_64-w64-mingw32; OpenSSL 1.1.0h 如果我尝试选择空结果:LAN:0,001 秒,***:0,04 到 0,09 秒 从您的问题和评论中,我们看到您的 *** 比非 *** 连接慢了大约 50 倍,因此您很幸运能从 2 秒缩短到 48 秒,而不是 100 秒。可以肯定,尝试获取有关网络活动的会话统计信息,它会告诉您发送和等待数据所花费的时间。 处理查询和获取数据所需的 SQL*Net 往返次数加剧了网络延迟。最小化网络延迟的一种方法是确保将 C# 程序中的数组获取大小设置为较大的数字。假设它是 10,那么您需要 5、200 次网络往返才能返回 52,000 行。而如果将其设置为 5,000,则您只需要 11 次以上的网络往返。 @k4yaman 谢谢你的来信。我已经发布了答案。 【参考方案1】:

处理查询和获取数据所需的 SQL*Net 往返次数加剧了网络延迟。最小化网络延迟的一种方法是确保将 C# 程序中的数组 fetch size 设置为一个较高的数字。假设它是 10,那么您需要 5,200 次网络往返才能返回 52,000 行。而如果将其设置为 5,000,则您只需要 11 次网络往返。

对于 MS SQL 数据库,Packet size 可用于连接字符串。

【讨论】:

以上是关于通过 *** 的 Oracle 和 MS SQL 查询非常慢的主要内容,如果未能解决你的问题,请参考以下文章

将MS Access表单日期传递到Oracle SQL

如何将 MS-SQL Server SELECT 查询转换/迁移到 Oracle 和 MySQL?

oracle/ms sql 系统表

Oracle Functions转成Ms-Sql procedure

MS SQL 模仿ORACLE的DESC

我应该在我的 MS SQL 服务器中安装啥 Oracle 驱动程序才能使用 DTS 将数据从 Oracle 服务器复制到 MS SQL 服务器?