DBCC FREEPROCCACHE 和 DBCC FREESYSTEMCACHE('SQL Plans') 都不做任何事情来释放 CACHESTORE_SQLCP 内存

Pro*_*ame 15 sql-server optimization memory sql-server-2016 amazon-rds

CACHESTORE_SQLCP Sql 计划在几天后占用 > 38 GB。

我们已经在运行“优化临时工作负载”选项。(实体框架和自定义报告创建了很多临时!)

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

当我运行时:

DBCC FREESYSTEMCACHE('SQL Plans');
Run Code Online (Sandbox Code Playgroud)

或者

DBCC FREEPROCCACHE
Run Code Online (Sandbox Code Playgroud)

或者

DBCC FREESYSTEMCACHE ('SQL Plans') WITH MARK_IN_USE_FOR_REMOVAL
Run Code Online (Sandbox Code Playgroud)

或者

DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;
Run Code Online (Sandbox Code Playgroud)

它似乎没有清除它:

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
Run Code Online (Sandbox Code Playgroud)

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

真正奇怪的是

SELECT COUNT(*) FROM sys.dm_exec_cached_plans
Run Code Online (Sandbox Code Playgroud)

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

CACHESTORE_SQLCP 占用了所有可用内存的 60% 以上,这是一个问题,因为偶尔会发生内存等待。此外,我们不得不在周末终止一个持续 4 小时的例行 DBCC CHECKDB,因为内存不足导致等待(它立即完成,没有错误,打开 PHYSICAL_ONLY)。

有没有办法回收这些内存(除了每晚重启!?)?

内存消耗图 内存消耗图表

从评论/答案更新

当我跑

SELECT * FROM sys.fn_my_permissions(NULL,NULL)
Run Code Online (Sandbox Code Playgroud)

我得到

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
Run Code Online (Sandbox Code Playgroud)

其中包括所需的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
Run Code Online (Sandbox Code Playgroud)

输出:

pool_id name    cache_memory_kb  compile_memory_kb
1   internal    38368408         1168080
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

更新

RDS 引擎版本从 13.00.2164.0.v1 升级到 13.00.4422.0.v1。虽然它设置为自动次要版本升级,但它似乎并没有让我们更新到最新版本。本周末将重新启动并安装它,看看它是否有帮助。

Pro*_*ame 6

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

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

时间会证明它现在是否更明智地使用内存,但至少现在我有办法在它再次变得过于臃肿时重置它。

  • 我们在 13.0.4001.0 上看到了同样的问题。不得不退回 SQL 以清除 proc 缓存。什么都没有被编译,但 proc 缓存被“卡住”,无论我们尝试什么都不会清除。自从弹回 SQL 后就再也没有看到它发生过,但想知道是否存在某种内存泄漏或错误。 (2认同)