我的 SQL Server 2016 中的查询执行速度很慢。
服务器配置:
- 总物理内存:128 GB
- SQL 服务器最大内存:102 GB
- 事务复制已启用。
- 数据库大小:1.6 TB
- Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64) 2018 年 3 月 18 日 09:11:49 版权所有 (c) Windows Server 2016 Standard 10.0(Build 14393:)上的 Microsoft Corporation Standard Edition(64 位)
我运行ring buffer
查询以检查物理内存是否不足。我检查环形缓冲区内存压力的原因是因为我的计划缓存也经常被清除,即使没有人运行任何脚本来清除缓存。我得到以下结果,我看到 HIGH 和 LOW 具有相同的值Avail Phys Mem.KB
。
我学到的一件事是所有RESOURCE_MEMPHYSICAL_LOW
指示器进程都是 2,这意味着内存问题出在分配给 SQL Server 的内存中,而不是操作系统和其他应用程序可用的剩余内存中。供参考。这是一个 SQL Server 专用服务器。
我还检查了性能监视器,Avaialable MBytes
其显示值 16,662.00 (16 GB),如下所示。
我认为 16 GB 足以用于操作系统和其他应用程序,这是一个 SQL Server 专用服务器。
还检查了服务器诊断。它说有 25 GB 可用。
所以现在我很困惑是否:
- 该服务器是否存在内存压力?
- 该
RESOURCE_MEMPHYSICAL_LOW
标志是由操作系统或外部进程或 SQL Server 设置的? - 我应该启用 LPIM 来解决这个问题吗?
根据@Shanky 的回答的其他详细信息。
- 我启用了查询存储,但一周前禁用了它。
- 带有时钟指针的 SQL Server 计划的 rounds_count
HAND_EXTERNAL
正在增加。
更多细节。
- 我正面临一些查询授予的大量内存,这导致 RESOURCE_SEMAPHORE 等待其他查询。
这个巨大的内存授予(我检查过的一个查询,内存授予是 ~7GB)是否会导致 SQL Server 的内存压力,这是否是计划缓存清除和RESOURCE_MEMPHYSICAL_LOW
标记的原因。
由于信息有限,我不能肯定地说。需要更多参数和 perfmon 的输出来说明内存压力。但是,是的,从您当时发布的查询输出来看
2018-10-23 11:22:30:457
,某些进程的内存确实不足,而不是整个 SQL Server 系统。查看它表示的输出
RESOURCE_MEMPHYSICAL_LOW
值,2
这IndicatorProcess
意味着正在运行的某些进程确实面临内存压力,如果IndicatorSystem
值为 2,那将是系统范围的内存压力。另请注意,内存压力来自低物理内存 (RAM) 而不是低虚拟内存 (VAS)。所以你可以看到仅仅取一段时间的值很难说有持续的内存压力。我建议您阅读Using sys.dm_os_ring_buffers To Diagnose Memory Issues in SQL Server以了解值 Indicatorsystem 和 IndicatorProcess 的含义LPIM不会解决问题,它只会掩盖问题并作为解决方法出现。您需要找到导致资源监视器标记低内存通知的原因,可能是某些正在运行的进程导致了它。现在计划缓存经常被清除是很多人从 SQL Server 2016 开始报告的事情,这可能是由于查询存储,你在使用一个吗?。查询存储曾经是计划缓存清除的罪魁祸首,但由于您使用的是最新的 SP,我怀疑这个因素。
要查看缓存的内存压力,我们还可以使用 DMV sys.dm_os_memory_cache_clock_hands
如果
rounds_count
增加,这意味着有压力迫使时钟更频繁地扫描缓存并删除条目。编辑:
是的,很有可能,我已经看到您针对这个问题提出了特定的话题,我只会补充一点,在您进行任何操作之前,请确保您已更新统计信息并对索引进行碎片整理。过时的统计数据可能会导致糟糕的计划,最终可能会要求更多内存并因此等待信号量。
以下是讨论类似问题的线程列表