DBCC FREEPROCCACHE (Transact-SQL)

适用于:yesSQL Server(所有支持的版本)YesAzure SQL 数据库YesAzure SQL 托管实例yesAzure Synapse Analytics yesAnalytics Platform System (PDW)

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

注意

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

Topic link iconTransact-SQL 语法约定

语法

SQL Server 的语法:

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

Azure Synapse Analytics 和 Analytics Platform System (PDW) 的语法:

DBCC FREEPROCCACHE [ ( COMPUTE | ALL ) ] 
     [ WITH NO_INFOMSGS ]   
[;]  

注意

若要查看 SQL Server 2014 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

( { 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
取消显示所有信息性消息。

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 已启用
  • 并行的开销阈值
  • 跨数据库所有权链接
  • 索引创建内存
  • 最大并行度
  • max server memory
  • max text repl size
  • 最大工作线程数
  • min memory per query
  • min server memory
  • 查询调控器开销限制
  • 查询等待
  • remote query timeout
  • user options

结果集

如果未指定 WITH NO_INFOMSGS 子句,DBCC FREEPROCCACHE 将返回:“DBCC 执行完毕。 如果 DBCC 输出了错误消息,请与系统管理员联系。”

权限

适用范围:SQL ServerAnalytics Platform System (PDW)

  • 需要对服务器的 ALTER SERVER STATE 权限。

适用范围:Azure Synapse Analytics

  • 要求具有 DB_OWNER 固定服务器角色中的成员资格。

Azure Synapse Analytics 和 Analytics Platform System (PDW) 的一般备注

可以同时运行多个 DBCC FREEPROCCACHE 命令。 在 Azure Synapse Analytics 或 Analytics Platform System (PDW) 中,清除计划缓存可能导致查询性能暂时性降低,因为传入查询编译新计划,而不是重复使用任何以前缓存的计划。

在计算节点上运行时,DBCC FREEPROCCACHE (COMPUTE) 仅会导致 SQL Server 重新编译查询。 它不会导致 Azure Synapse Analytics 或 Analytics Platform System (PDW) 重新编译在控制节点上生成的并行查询计划。 可在执行期间取消 DBCC FREEPROCCACHE。

Azure Synapse Analytics 和 Analytics Platform System (PDW) 的限制与局限

无法在事务中运行 DBCC FREEPROCCACHE。 EXPLAIN 语句中不支持使用 DBCC FREEPROCCACHE。

Azure Synapse Analytics 和 Analytics Platform System (PDW) 的元数据

运行 DBCC FREEPROCCACHE 时,会向 sys.pdw_exec_requests 系统视图中添加新行。

示例:SQL Server

A. 从计划高速缓存中清除查询计划

以下示例通过指定查询计划句柄从计划高速缓存中清除查询计划。 为了确保示例查询在计划高速缓存中,首先执行该查询。 将查询 sys.dm_exec_cached_planssys.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  

示例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

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

另请参阅

DBCC (Transact-SQL)
资源调控器
ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL)