由于“客户端处理时间”很长,远程 SELECT 语句很慢,但本地速度很快

Fra*_*ock 12 performance sql-server-2008 remote

当连接到我们的生产服务器(SQL Server 2008,非常强大的机器)时,这个 SELECT 语句需要2 秒,吐回所有字段(总共 4 MB 数据)。

SELECT TOP (30000) *
FROM person
WITH(NOLOCK);
Run Code Online (Sandbox Code Playgroud)

从同一网络上的任何其他框(使用 SQL 身份验证或 Windows 身份验证连接),相同的查询需要1 分 8 秒

我正在使用这个非常简单的语句进行测试,以说明它不是索引问题或与查询相关的问题。(我们目前所有查询都存在性能问题......)

这些行成块出现,而不是一次全部出现。我立即得到我的第一行,然后等待超过 1 分钟让成批的行进来。

这是从远程框运行时查询的客户端统计信息:

Query Profile Statistics
  Number of INSERT, DELETE and UPDATE statements 0
  Rows affected by INSERT, DELETE, or UPDATE statements 0
  Number of SELECT statements  2
  Rows returned by SELECT statements 30001
  Number of transactions 0

Network Statistics
  Number of server roundtrips 3
  TDS packets sent from client        3
  TDS packets received from server 1216
  Bytes sent from client         266
  Bytes received from server 4019800

Time Statistics
  Client processing time 72441 ms (72 seconds)
  Total execution time   72441 ms
  Wait time on server replies 0
Run Code Online (Sandbox Code Playgroud)

我们可以看到“客户端处理时间”等于总执行时间。

有谁知道我可以采取哪些步骤来诊断为什么实际数据的传输需要很长时间?

是否有限制或限制机器之间数据传输速度的 SQL 配置参数?

Fra*_*ock 8

此问题现已解决。

是网络问题,SQL box 使用的是100 MB/s 的网卡,而不是10 GB/s 的网卡...

更改网络配置以使用正确的网卡已解决该问题。现在,对于来自生产 SQL 框和网络上其他框的所有查询,我们都获得了相似的性能。

感谢大家的帮助。


小智 5

根据您的信息,您的问题肯定与网络有关。因此,它必须由网络专业人员处理(我不是那个人)。

可能有帮助的事情:

  • 更快的 NIC 卡(在 SQL 服务器上)。
  • 在服务器(Web 服务器和 SQL Server)之间添加分配的/特定的 NIC 卡/子网。

Web 服务器是否与 SQL 服务器在同一个子网中?

它们之间是否有路由器/网桥等?

SQL 服务器上可能的更改不多:

  • 输出数据由 SQL Server 使用专有的 MS“TDS 协议”发送。
  • TDS 缓冲区的默认大小为 4 KB。参见 MSDB:“网络数据包大小选项”
  • 压缩数据(使用 SQL Server 或外部应用程序) - 取决于数据的性质。

您使用的是默认大小:查看您的统计信息:“从服务器 1216 收到的 TDS 数据包”(4MB/1K=4KB)。是的,可以更改 TDS 缓冲区的大小:参见谷歌:“TDS 协议批量大小”

关于这个话题的好讨论:“sql 的网络数据包大小真的决定了往返流量吗?”

但是,更改 TDS 封装尺寸将(不可避免地)产生不可预测的影响,仅应在特殊情况下用于生产。

改变架构或在中间层引入数据缓存也会有所帮助。