删除计划缓存中的所有元素,通过指定计划句柄或 SQL 句柄从计划缓存中删除特定计划,或者删除与指定资源池相关联的所有缓存条目。
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