如何在不重启 RDS for SQL Server 实例的情况下清除缓冲区缓存或其他缓存?
上次更新日期:2022 年 10 月 13 日
我想要清除我的 Amazon Relational Database Service (Amazon RDS) for Microsoft SQL Server 实例上的 Microsoft SQL Server 缓存。如何在不重启数据库实例的情况下实现?
简短描述
清除 SQL Server 缓存的方法有许多种,从非常精细的缓存清除到完整的缓存清除。您可以使用以下工具清除缓存。所有这些工具均可用于 SQL Server 的数据库控制台命令(DBCC):
- DBCC FREEPROCCACHE:通过删除整个计划缓存来清除缓存。此命令还会删除特定计划或者删除与资源池相关的缓存条目。
- DBCC FREESYSTEMCACHE:除了删除计划缓存中的元素外,DBCC FREESYSTEMCACHE 还可以清除其他内存缓存。
- DBCC ALTER DATABASE SCOPED CONFIGURATION:此命令从 SQL Server 2016 起可用。
解决方法
注意:最佳实践是先全面测试以下命令,然后再在生产环境中运行它们。测试有助于识别可能会在实施过程中发生的潜在问题。
确定使用的前五位缓存和内存
运行以下命令,以确定使用的前五位缓存内存:
SELECT TOP(5) name AS [Name],
SUM(pages_kb) AS [SizeKb]
FROM sys.dm_os_memory_cache_counters WITH (NOLOCK)
GROUP BY name
ORDER BY SizeKb DESC
从缓存中删除一个计划(参数嗅探问题)
运行以下命令以识别错误的计划:
SELECT cp.plan_handle, cp.objtype, cp.usecounts,
DB_NAME(st.dbid)
AS [DatabaseName], st.text
FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
WHERE st.text LIKE N'%[search string]%' OPTION (RECOMPILE);
运行以下命令之一以删除错误的计划:
DBCC FREEPROCCACHE (plan_handle);
或
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE [plan_handle];
从缓存中删除按需和准备好的计划
如果缓存中具有太多按需计划,请运行以下命令将其删除:
DBCC FREESYSTEMCACHE ('SQL Plans')
清除当前数据库的计划缓存
如果您运行的是 SQL Server 2016 或更高版本,请运行以下命令:
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
或
DBCC FREESYSTEMCACHE('DatabaseName')
如果您使用的是 SQL 2016 之前的 SQL Server 版本,请运行以下命令:
declare @dbid int = (select DB_ID())
DBCC FLUSHPROCINDB (@dbid);
清除所有缓存
DBCC FREESYSTEMCACHE('ALL')
或
DBCC FREEPROCCACHE WITH NO_INFOMSGS;
注意:DBCC DROPCLEANBUFFERS 命令用于清除所有缓存和缓冲池。此命令在 Amazon RDS for SQL Server 中不受支持,因为它需要 sysadmin 固定服务器角色中的成员资格。