我们的 SQL Server 面临性能问题。
7 台服务器,都运行相同的应用程序,都有相同的问题。
SELECT @@VERSION
Microsoft SQL Server 2017 (RTM-CU19) (KB4535007) - 14.0.3281.6 (X64) Jan 23 2020 21:00:04 Copyright (C) 2017 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor)
当您查看累积的总服务器等待统计信息时,显示 99% ASYNC_NETWORK_IO。我们首先假设这是由应用程序引起的。然而:
当我们进行查询(从应用程序捕获)并从 SSMS 中将其作为测试运行时,执行后忽略结果。我们在 TCP 连接上运行它大约需要 6 秒,在命名管道连接上运行它需要 50 秒。我们得到非常缓慢的结果。
(不考虑执行后的结果,查询给出的结果为 57k 行 227 列,大小为 221MB。)
它是核心版,所以我们不能使用本地连接。我们测试了使用 TCP 和命名管道进行远程连接。
通过 TCP
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 4 ms, elapsed time = 4 ms.
(57844 rows affected)
Table 'STORE-CUW01$Item'. Scan count 1, logical reads 14774, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row affected)
SQL Server Execution Times:
CPU time = 1359 ms, elapsed time = 6868 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
因此,即使聚集索引扫描只需要 0.62 秒即可完成,但即使在执行检查后忽略结果,仍需要 6.8 秒才能完成查询
命名管道
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
(57844 rows affected)
Table 'STORE-CUW01$Item'. Scan count 1, logical reads 14774, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row affected)
SQL Server Execution Times:
CPU time = 1578 ms, elapsed time = 54202 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
使用命名管道,情况更糟。同样,完成聚集索引扫描只需要半秒,而完成查询则需要 54 秒。
如果我将数据库恢复到我的笔记本电脑并运行相同的查询,我将获得 0.4 秒的聚集索引扫描和 1375 毫秒的 CPU 时间,以及 1462 毫秒的运行时间。
通过使用https://www.sqlskills.com/blogs/paul/capturing-wait-stats-for-a-single-operation/
我收集了 TCP 连接和命名管道连接的测试的等待统计信息:
TCP
命名管道
等待的总时间不加起来。tcp 测试只有 0.472 秒的等待时间和 6.8 秒的运行时间,而 Naped Pipe 测试只有 40.7 秒的等待时间和 54.2 秒的运行时间。
更多相关信息
- SQL Server 是虚拟服务器 VMware
- 这是windows核心版
- 4核
- 64GB 内存,只有 16GB 分配给 SQL Server
- 应用程序服务与 SQL Server 在同一台服务器上运行
- 应用程序本身与 MARS 会话连接
我们不明白时间延迟是从哪里来的。如果您检查了忽略结果,查询不应该更快地完成吗?