DBCC FREEPROCCACHE (Transact-SQL)

删除计划高速缓存中的所有元素,通过指定计划句柄或 SQL 句柄从计划高速缓存中删除特定计划,或者删除与指定资源池相关联的所有高速缓存条目。

备注

DBCC FREEPROCCACHE 不清除本机编译的存储过程的执行统计信息。过程高速缓存不包含有关本机编译的存储过程的信息。从过程执行中收集的任何执行统计信息将显示在执行统计信息 DMV 中:sys.dm_exec_procedure_stats (Transact-SQL)sys.dm_exec_query_plan (Transact-SQL)

适用范围:SQL Server(SQL Server 2008 到当前版本)。

主题链接图标 Transact-SQL 语法约定

语法

DBCC FREEPROCCACHE [ ( { plan_handle | sql_handle | pool_name } ) ] [ WITH NO_INFOMSGS ]

参数

注释

小心使用 DBCC FREEPROCCACHE 清除计划高速缓存。 例如,释放计划高速缓存将导致系统重新编译存储过程,而不重用高速缓存中的存储过程。 这会导致查询性能暂时性地突然降低。 对于计划高速缓存中每个已清除的高速缓存存储区,SQL Server 错误日志将包含以下信息性消息:“由于 'DBCC FREEPROCCACHE' 或 'DBCC FREESYSTEMCACHE' 操作,SQL Server 经历了 '%s' 高速缓存存储区(计划缓存的一部分)的 %d 次刷新。”只要每五分钟刷新一次高速缓存,此消息就将每五分钟记录一次。

结果集

如果未指定 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

请参阅

参考

DBCC (Transact-SQL)

概念

资源调控器