几天后,CACHESTORE_SQLCP Sql Plans 占用 > 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 可用。虽然它设置为自动次要版本升级,但它似乎并没有让我们更新到最新版本。将在本周末重新启动并安装它,看看它是否有帮助。
我升级到 13.00.4422.0.v1 (SQL Server 2016 SP1) 并重新启动。
到目前为止,我可以使用
DBCC FREESYSTEMCACHE('SQL Plans');
命令清除 SQL 计划内存!时间会证明它现在是否更明智地使用内存,但至少现在如果它再次变得过于臃肿,我有办法重置它。
要求
为了运行
DBCC FREEPROCCACHE
或DBCC FREESYSTEMCACHE
您的帐户需要权限ALTER SERVER STATE
。参考
DBCC FREEPROCCACHE (Transact-SQL) (Microsoft Docs)
资源管理器
AWS RDS 是否允许资源调控器设置?如果是,那么语法是:
了解您是否有游泳池:
验证权限
运行以下命令以确定您是否具有这些权限:
限制/限制
授予 AWS RDS 实例管理员的权限存在一些限制,如Microsoft SQL Server 安全一章中的Amazon RDS上的 Microsoft SQL Server 一文所述
这里有一个概述:
自文档发布以来,这些限制/限制可能已更改。
其他资源
Brent Ozar 写了一篇文章“ SQL Server RDS ”,他指出...
亚马逊支持
如果您的帐户具有所需的权限并且您无法释放缓存,那么您可能需要向 Amazon 开具支持票。