DBCC FREEPROCCACHE (Transact-SQL)
删除计划缓存中的所有元素,通过指定计划句柄或 SQL 句柄从计划缓存中删除特定计划,或者删除与指定资源池相关联的所有缓存条目。
语法
DBCC FREEPROCCACHE [ ( { plan_handle | sql_handle | pool_name } ) ] [ WITH NO_INFOMSGS ]
参数
( { plan_handle | sql_handle | pool_name } )
plan_handle 用于唯一标识已执行并且其计划驻留在计划缓存中的批处理的查询计划。 plan_handle 的数据类型为 varbinary(64),可以从下列动态管理对象中获得此参数:sql_handle 是要清除的批处理的 SQL 句柄。 sql_handle 的数据类型为 varbinary(64),可以从下列动态管理对象中获得此参数:
pool_name 是资源调控器资源池的名称。 pool_name 的数据类型为 sysname,可通过查询 sys.dm_resource_governor_resource_pools 动态管理视图获得此参数。
若要将资源调控器工作负荷组与资源池相关联,请查询 sys.dm_resource_governor_workload_groups 动态管理视图。 有关会话的工作负荷组的信息,请查询 sys.dm_exec_sessions 动态管理视图。
WITH NO_INFOMSGS
取消显示所有信息性消息。
注释
小心使用 DBCC FREEPROCCACHE 清除计划缓存。 例如,释放计划缓存将导致系统重新编译存储过程,而不重用缓存中的存储过程。 这会导致查询性能暂时性地突然降低。 对于计划缓存中每个已清除的缓存存储区,SQL Server 错误日志都包含以下信息性消息:"由于 'DBCC FREEPROCCACHE' 或 'DBCC FREESYSTEMCACHE' 操作,SQL Server 经历了 '%s' 缓存存储区(计划缓存的一部分)的 %d 次刷新。”每隔五分钟,只要缓存在这段时间间隔内得到刷新,此消息就记录一次。
以下配置操作也清除了过程缓存:
access check cache bucket count
access check cache quota
clr enabled
cost threshold for parallelism
cross db ownership chaining
index create memory
max degree of parallelism
max server memory
max text repl size
max worker threads
min memory per query
min server memory
query governor cost limit
query wait
remote query timeout
user options
结果集
如果未指定 WITH NO_INFOMSGS 子句,DBCC FREEPROCCACHE 将返回:
“DBCC 执行完毕。 如果 DBCC 输出了错误消息,请与系统管理员联系。”
权限
需要对服务器的 ALTER SERVER STATE 权限。
示例
A.从计划缓存中清除查询计划
以下示例通过指定查询计划句柄从计划缓存中清除查询计划。 为了确保示例查询在计划缓存中,首先执行该查询。 将查询 sys.dm_exec_cached_plans 和 sys.dm_exec_sql_text 动态管理视图以返回查询的计划句柄。 然后,将结果集中的计划句柄值插入 DBCC FREEPROCACHE 语句,以从计划缓存中仅删除该计划。
USE AdventureWorks2012;
GO
SELECT * FROM Person.Address;
GO
SELECT plan_handle, st.text
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
WHERE text LIKE N'SELECT * FROM Person.Address%';
GO
下面是结果集。
plan_handle text
-------------------------------------------------- -----------------------------
0x060006001ECA270EC0215D05000000000000000000000000 SELECT * FROM Person.Address;
(1 row(s) affected)
-- Remove the specific plan from the cache.
DBCC FREEPROCCACHE (0x060006001ECA270EC0215D05000000000000000000000000);
GO
B.清除计划缓存中的所有计划
以下示例清除计划缓存中的所有元素。 指定了 WITH NO_INFOMSGS 子句来阻止显示信息消息。
DBCC FREEPROCCACHE WITH NO_INFOMSGS;
C.清除与资源池相关联的所有缓存条目
以下示例清除与指定资源池相关联的所有缓存条目。 sys.dm_resource_governor_resource_pools 视图首先被查询,以便获取 pool_name 的值。
SELECT * FROM sys.dm_resource_governor_resource_pools;
GO
DBCC FREEPROCCACHE ('default');
GO