我们的RESOURCE_SEMAPHORE
其中一台服务器存在内存压力问题(等待),但同时进行的活动连接很少。从逻辑上讲,睡眠连接似乎不会保留记忆,但我想知道他们是否真的这样做了?IderaDM 显示了几个内存使用率较高的休眠连接。
这是具有 27 Gb 内存的 SQL 2008 SP3 服务器。在任何时刻通常只有 2 到 10 个活动调用正在进行,其中很大一部分正在等待 resource_semaphore。该服务器拥有我们的第三方数据库,因此我们无法更改大部分调用/过程。
那么,睡眠连接是否有可能保留在内存中,或者我应该去别处寻找?
如果您正在尝试跟踪内存使用情况以及哪些查询是最大的违规者,请执行以下步骤:
确定实例上哪个数据库消耗的内存最多
深入了解所述数据库中哪些对象消耗的内存最多
查看哪些查询正在命中内存中的所述对象
希望这会给您一些麻烦的查询。您可能会发现实例中没有适当数量的内存来满足它试图容纳的工作负载。或者,您可能会发现用户编写的查询缺少像谓词(例如
WHERE
子句)这样简单令人恼火的东西。如果你想深入了解执行计划,你可以把
plan_handle
它发送到这个查询中:并审查执行计划。如果您无法调整所述查询,这可能对您没有用。
一旦您弄清楚什么在使用实例上的内存,您就可以更好地了解如何让系统恢复到健康状态。
我使用下面的查询,没有排除任何内容,因为我想查看 SQL Server 后台等待的位置,并且它们都将处于相同的百分比。
HADR_FILESTREAM_IOMGR_IOCOMPLETION
、XE_TIMER_EVENT
和等项目REQUEST_FOR_DEADLOCK_SEARCH
。如果您RESOURCE_SEMAPHORE
在系统背景下,那么您就没有问题。如果是上面系统后台的东西,那就贴出来是什么。RESOURCE_SEMAPHORE表示您有正在等待内存授予的查询。
我会查询
查看什么正在用尽您所有的查询工作区内存,以及什么正在等待内存。 本文提供了一些解决RESOURCE_SEMAPHORE问题 的好技巧。不幸的是,这通常意味着您需要调整一个或多个查询,因此如果它是第 3 方代码,您可能必须返回供应商。根据具体问题,您可能可以通过添加索引来改进它,但这只是推测。