适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Microsoft Fabric 中的 SQL 数据库
删除计划高速缓存中的所有元素,通过指定计划句柄或 SQL 句柄从计划高速缓存中删除特定计划,或者删除与指定资源池相关联的所有高速缓存条目。
注意
DBCC FREEPROCCACHE 不清除本机编译的存储过程的执行统计信息。 过程缓存不包含有关本机编译的存储过程的信息。 从过程执行中收集的任何执行统计信息都将显示在执行统计信息 DMV 中:sys.dm_exec_procedure_stats (Transact-SQL) 和 sys.dm_exec_query_plan (Transact-SQL)。
语法
SQL Server 和 Azure SQL 数据库的语法:
DBCC FREEPROCCACHE [ ( { plan_handle | sql_handle | pool_name } ) ] [ WITH NO_INFOMSGS ]
Azure Synapse Analytics 的语法:
DBCC FREEPROCCACHE [ ( COMPUTE | ALL ) ]
[ WITH NO_INFOMSGS ]
[;]
参数
( { plan_handlesql_handle | pool_name } )
plan_handle 用于唯一标识已执行并且其计划驻留在计划缓存中的批处理的查询计划。 plan_handle 为 varbinary(64),可以从下列动态管理对象中获得计划句柄:
- sys.dm_exec_cached_plans
- sys.dm_exec_requests
- sys.dm_exec_query_memory_grants
- sys.dm_exec_query_stats
sql_handle 是要清除的批处理的 SQL 句柄。 sql_handle 为 varbinary(64),可以从下列动态管理对象中获得计划句柄:
- sys.dm_exec_query_stats
- sys.dm_exec_requests
- sys.dm_exec_cursors
- sys.dm_exec_xml_handles
- sys.dm_exec_query_memory_grants
pool_name 是资源调控器资源池的名称。 pool_name 的数据类型为 sysname,可通过查询 sys.dm_resource_governor_resource_pools 动态管理视图获得此参数。
若要将资源调控器工作负荷组与资源池相关联,请查询 sys.dm_resource_governor_workload_groups 动态管理视图。 有关会话的工作负荷组的信息,请查询 sys.dm_exec_sessions 动态管理视图。
使用 NO_INFOMSGS
取消显示所有信息性消息。
COMPUTE
从每个“计算”节点,清除查询计划缓存。 这是默认值。
ALL
从每个“计算”节点和“管理”节点,清除查询计划缓存。
注意
从 SQL Server 2016 (13.x) 开始,可以使用 ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE 清除当前数据库的过程(计划)缓存。
注解
请审慎使用 DBCC FREEPROCCACHE 清除计划缓存。 清除过程(计划)缓存会逐出所有计划,并且传入查询执行将编译新计划,而不是重复使用任何以前缓存的计划。
由于新编译数量增加,这可能导致查询性能骤降。 对于计划缓存中每个已清除的缓存,SQL Server 错误日志将包含以下信息性消息:
SQL Server has encountered %d occurrence(s) of cachestore flush for the '%s' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.
每隔五分钟,只要缓存在这段时间间隔内得到刷新,此消息就记录一次。
以下重新配置操作也将清除过程缓存:
- 访问检查缓存存储桶计数
- 访问检查缓存配额
- CLR 已启用
- 并行的开销阈值
- 跨数据库所有权链接
- 索引创建内存
- 最大并行度
- 最大服务器内存
- 最大文本重装大小
- 最大工作线程数
- 每个查询的最小内存
- 最小服务器内存
- 查询调控器开销限制
- 查询等待
- 远程查询超时
- 用户选项
在 Azure SQL 数据库中,DBCC FREEPROCCACHE 对托管当前数据库或弹性池的数据库引擎实例执行操作。 在用户数据库中执行 DBCC FREEPROCCACHE 会清除该数据库的计划缓存。 如果数据库位于弹性池中,则它还会清除该弹性池内所有其他数据库中的计划缓存。 在 master 数据库中执行命令不会影响同一逻辑服务器上的其他数据库。 使用 Basic、S0 或 S1 服务目标在数据库中执行此命令可能会在同一逻辑服务器上使用这些服务目标清除其他数据库中的计划缓存。
结果集
如果未指定 WITH NO_INFOMSGS 子句,则 DBCC FREEPROCCACHE 返回:
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限
适用范围:SQL Server
- 需要对服务器的 ALTER SERVER STATE 权限。
适用于:Azure SQL 数据库
- 要求具有 ##MS_ServerStateManager## 服务器角色的成员身份。
适用范围:Azure Synapse Analytics
- 要求具有 db_owner 固定服务器角色的成员身份。
Remarks for Azure Synapse Analytics
可以同时运行多个 DBCC FREEPROCCACHE 命令。
在 Azure Synapse Analytics 中,清除计划缓存可能导致查询性能暂时下降,因为输入查询会编译新的计划,而不是重复使用之前缓存的计划。
在计算节点上运行时,DBCC FREEPROCCACHE (COMPUTE) 仅会导致 SQL Server 重新编译查询。 它不会让 Azure Synapse Analytics 重新编译控制节点生成的并行查询计划。
DBCC FREEPROCCACHE 可以在执行期间取消。
Azure Synapse Analytics 的限制与局限
DBCC FREEPROCCACHE 无法在事务中运行。
EXPLAIN 语句中不支持 DBCC FREEPROCCACHE。
Metadata for Azure Synapse Analytics
运行 sys.pdw_exec_requests 时,将向 DBCC FREEPROCCACHE 系统视图添加一个新行。
示例:SQL Server
A. 从计划缓存中清除查询计划
以下示例通过指定查询计划句柄从计划高速缓存中清除查询计划。 为了确保示例查询在计划高速缓存中,首先执行该查询。 将查询 sys.dm_exec_cached_plans 和 sys.dm_exec_sql_text 动态管理视图以返回查询的计划句柄。
然后,将结果集中的计划句柄值插入 DBCC FREEPROCACHE 语句,以从计划高速缓存中仅删除该计划。
USE AdventureWorks2022;
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
示例:Azure Synapse Analytics
D. DBCC FREEPROCCACHE 基本语法
以下示例从计算节点中删除所有现有的查询计划缓存。 虽然上下文设置为 UserDbSales,但所有数据库的计算节点查询计划缓存都将删除。
WITH NO_INFOMSGS 子句可防止结果中显示信息性消息。
USE UserDbSales;
DBCC FREEPROCCACHE (COMPUTE) WITH NO_INFOMSGS;
以下示例的结果与上一个示例的结果相同,只是将在结果中显示信息性消息。
USE UserDbSales;
DBCC FREEPROCCACHE (COMPUTE);
如果请求了信息性消息且执行成功,则查询结果中每个计算节点各具一行。
E. 授予运行 DBCC FREEPROCCACHE 的权限
以下示例为登录名 David 提供运行 DBCC FREEPROCCACHE 的权限。
GRANT ALTER SERVER STATE TO David;
GO