如何解决 RESOURCE_SEMAPHORE 和 RESOURCE_SEMAPHORE_QUERY_COMPILE 等待类型

KAS*_*DBA 13 performance sql-server-2005 sql-server

我们试图找出运行缓慢的 sql server 查询从其中一个数据库中命中/获取数据的根本原因,大小为 300 GB,托管在具有以下配置的服务器上:

Windows server 2003 R2, SP2, Enterprise Edition, 16 GB RAM, 12 CPU'S 32 Bit

SQL Server 2005,SP4,企业版,32 位。

我们已经通知企业升级到 64 位,这需要一个多月的时间。

但是对于当前的问题,我们正在尝试收集数据,如果我们可以解决内存压力或最终得出增加RAM的结论。

已完成操作:重新索引和更新统计信息适用于此数据库。

如下所示,过去 5 天我们一直在注意到信号量等待类型,在加载时间运行:

等待类型

以下查询后的信息很少:缓冲区大小= 137272

SELECT SUM(virtual_memory_committed_kb)
FROM sys.dm_os_memory_clerks
WHERE type='MEMORYCLERK_SQLBUFFERPOOL'
Run Code Online (Sandbox Code Playgroud)

和信号量内存 = 644024 每个以下查询

 SELECT SUM(total_memory_kb)
FROM sys.dm_exec_query_resource_semaphores
Run Code Online (Sandbox Code Playgroud)

下面是一些更多的信息,从采集dm_exec_query_resource_semaphoressys.dm_exec_query_memory_grantsDMV的

dmvs错误

所以从上面收集的信息和每个 SP_Blitz 数据资源信号量似乎是问题所在。

与可用的 16 GB RAM 相比,为资源信号量 ID 分配的内存“target_memory_kb”是否太低。

注意*每次运行 8 小时的分析“target_memory_kb”始终低于 1 GB,而可用 16 GB?

这里可能是什么问题以及如何解决,请提出建议

谢谢

Bre*_*zar 25

哦,天哪,我这里有一些坏消息。

在 32 位操作系统上,SQL Server 仅将前 4GB 内存用于诸如查询工作区之类的事情。(而且它也在为那 4GB 的操作系统而战 - 任何其他正在运行的应用程序也将争夺该内存。)

4GB 听起来可能很多,但编写需要几 GB 内存才能运行的查询相对容易。当足够多的查询需要足够的内存时,SQL Server 会抛出 RESOURCE_SEMAPHORE 等待,因为查询无法获得足够的内存来启动。RESOURCE_SEMAPHORE_QUERY_COMPILE 意味着他们甚至无法获得足够的内存来编译执行计划——是的,这很糟糕。

那你怎么解决呢?

  • 切换到 64 位操作系统(无论如何,您运行的操作系统早已不受支持)
  • 切换到 64 位版本的 SQL Server
  • 减少对服务器的内存需求(不要在这个机器上运行任何其他应用程序,这在 32 位机器上尤其重要,因为我们的上限只有 4GB)
  • 使用 AWE/PAE 开关使用更多内存 - 除了这不适用于 RESOURCE_SEMAPHORE 等待,因为 SQL Server 只能将前 4GB 用于查询工作区
  • 调整查询和索引,以便它们需要更少的内存

我什至不敢说最后一个,因为 32 位问题太糟糕了,而且在旧版本的 SQL Server 上真的很难。如果您使用的是当前计划,您可以浏览计划缓存并按内存授予对查询进行排序,找到最大的授予接收者,并对其进行调整。不过,这件旧古董不是一个选择。