DBCC FREEPROCCACHE或DBCC FREESYSTEMCACHE('SQL Plans')都不执行任何操作来释放CACHESTORE_SQLCP内存


13

CACHESTORE_SQLCP几天后,SQL计划占用超过38 GB的内存。

我们已经在运行“优化临时工作负载”选项。(实体框架和自定义报告会产生很多特殊条件!)

具有多可用区镜像的AWS RDS上的SQL Server 2016 SE 3.00.2164.0.v1

当我跑步时:

DBCC FREESYSTEMCACHE('SQL Plans');

要么

DBCC FREEPROCCACHE

要么

DBCC FREESYSTEMCACHE ('SQL Plans') WITH MARK_IN_USE_FOR_REMOVAL

要么

DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;

它似乎无法清除:

SELECT TOP 1 type, name, pages_kb FROM sys.dm_os_memory_clerks ORDER BY pages_kb  desc

type                name        pages_kb
CACHESTORE_SQLCP    SQL Plans   38321048

我在启用查询存储的情况下运行,但是我禁用了它以查看是否有任何干扰,这似乎没有帮助,但我将其保留了下来。

真正奇怪的是

SELECT COUNT(*) FROM sys.dm_exec_cached_plans

是1-3左右(似乎只显示当前正在运行的查询),即使所有内存已保留,甚至在我尝试清除任何内容之前。我想念什么?

CACHESTORE_SQLCP占用了所有可用内存的60%以上,这是一个令人担忧的问题,因为偶尔会有内存等待发生。另外,我们不得不在周末结束一个持续4个小时的例行DBCC CHECKDB,因为没有足够的内存堆积等待时间(它立即完成,PHYSICAL_ONLY处于打开状态,没有错误)。

有什么方法可以回收此内存(除了每晚重新启动!?)?

内存消耗图 内存消耗表

从评论/答案更新

当我跑步

SELECT * FROM sys.fn_my_permissions(NULL,NULL)

我懂了

entity_name subentity_name  permission_name
server      CONNECT SQL
server      CREATE ANY DATABASE
server      ALTER ANY LOGIN
server      ALTER ANY LINKED SERVER
server      ALTER ANY CONNECTION
server      ALTER TRACE
server      VIEW ANY DATABASE
server      VIEW ANY DEFINITION
server      VIEW SERVER STATE
server      ALTER SERVER STATE
server      CREATE SERVER ROLE
server      ALTER ANY SERVER ROLE

其中包括所需的ALTER SERVER STATE权限。

的输出DBCC FREEPROCCACHE

DBCC执行完成。如果DBCC打印了错误消息,请与系统管理员联系。

这是标准消息。RDS不支持的其他DBCC功能会给出有关权限的错误消息。

(一天之后,再次运行之后,SQL计划仍然是38,321,280 kb)

从评论/答案更新

SELECT pool_id, name, cache_memory_kb, compile_memory_kb FROM sys.dm_resource_governor_resource_pools

输出:

pool_id name    cache_memory_kb  compile_memory_kb
1   internal    38368408         1168080

DBCC FREEPROCCACHE ('internal') 没有做任何不同的事情

更新资料

SQL错误日志每次记录以下内容:

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Object Plans' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'SQL Plans' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Bound Trees' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

更新资料

RDS上的引擎版本已从13.00.2164.0.v1升级到13.00.4422.0.v1。尽管已将其设置为自动次要版本升级,但似乎并没有使我们保持最新。这个周末将重新启动并安装该软件,以查看是否有帮助。

Answers:


5

我已升级到13.00.4422.0.v1(SQL Server 2016 SP1)并重新启动。

到目前为止,我可以使用DBCC FREESYSTEMCACHE('SQL Plans');命令清除SQL Plan内存!

时间会告诉我们现在是否更明智地使用内存,但是至少现在我有一种方法可以重新设置它,以防它再次变得过于膨胀。


1
我仍然建议不要经常清除SQLCP并继续找出根本原因
Shanky

实体框架和自定义报告功能使几乎所有用户都能以某种方式运行几乎所有查询,从而创建了许多临时查询。如果有一种方法可以清除它们,或者甚至告诉它们永远不要缓存,那么它可能会有所帮助。到目前为止,自安装SP1以来,计划缓存一直徘徊在5.8GB左右。
专业冠冕堂皇的名称

你启用了吗Optimize for Ad-Hoc Workload?与38G相比,如果现在要使用5 GI,则认为不必担心工作量
Shanky

是的,已设置“针对临时工作负载进行优化”(如上所述)
专业冠冕堂皇名称

1
我们在13.0.4001.0上看到了相同的问题。不得不反弹SQL来清除proc缓存。什么都没有被编译,但是proc缓存被“卡住了”,无论我们尝试什么都无法清除。自从启动SQL之后,还没有看到它再次发生,但是想知道是否存在某种内存泄漏或错误。
GoodwinSQL

3

要求

为了运行DBCC FREEPROCCACHEDBCC FREESYSTEMCACHE您的帐户需要许可ALTER SERVER STATE

参考文献

资源总监

AWS RDS是否允许资源调控器设置?如果是,则语法为:

DBCC FREEPROCCACHE ('<pool_name>'). 

查明您是否有以下泳池:

SELECT * FROM sys.dm_resource_governor_resource_pools

验证权限

运行以下命令以确定您是否具有这些权限:

SELECT * FROM sys.fn_my_permissions(NULL,NULL)

限制/限制

正如在Microsoft SQL Server安全性一章中的Amazon RDS上的Microsoft SQL Server文章中所述,对授予AWS RDS实例的管理员的权限有一些限制

这里是一个概述:

以下服务器级角色当前在Amazon RDS中不可用:

  • 批量管理员
  • dbcreator
  • 磁盘管理员
  • 安全管理员
  • 服务器管理员
  • 系统管理员

以下服务器级权限在SQL Server数据库实例上不可用:

  • 管理员批量操作
  • 更改任何凭证
  • 更改任何事件通知
  • 更改任何会议
  • 更改任何服务器审核
  • 变更资源
  • 更改设置(您可以使用数据库参数组API来修改参数。有关更多信息,请参阅使用数据库参数组。
  • 认证服务器
  • CONTROL_SERVER
  • 创建DDL事件通知
  • 创建终点
  • 创建追踪事件通知
  • 外部访问组件
  • 关机(您可以使用RDS重启选项)
  • 不安全的大会
  • 更改任何可用性组(仅适用于SQL Server 2012)
  • 创建任何可用性组(仅适用于SQL Server 2012)

自文档发布以来,这些限制/限制可能已更改。

其他资源

布伦特·奥扎尔(Brent Ozar)写了一篇文章“ SQL Server RDS ”,他在文章中指出...

许多DBCC命令根本不起作用- DBCC DBINFO并且DBCC LOGINFO被明确拒绝。但是,我确实发现自己可以随意跑步DBCC FREEPROCCACHE

请记住,这些限制可能会随着时间而改变 –会定期添加新功能。

亚马逊支持

如果您的帐户具有所需的权限,但是您无法释放缓存,那么您可能要向Amazon提出支持票。


更新的问题具有更多详细信息。感谢您的周到和详细的回复。我确实遇到了RDS中其他问题的权限问题,但是应该支持这一点。如果今天在这里没有太多活动,我将与Amazon支持联系。与RDS问题相比,这似乎更像是SQL Server问题,而且我不知道他们的支持将与这个优秀社区相比有多丰富或特定!
专业冠冕堂皇的名字

1
感谢您的反馈。我想您可能想与Amazon或Microsoft共同开张罚单,因为似乎没有任何效果。再说一次,这可能是错误或功能(由于....的限制)。
约翰又名hot2use
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.