DBCC FREEPROCCACHE (Transact-SQL)

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

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

注意

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

Transact-SQL 语法约定

语法

SQL Server 和 Azure SQL 数据库的语法:

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 ]
[;]

参数

( { 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

在 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 ServerAnalytics Platform System (PDW)

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

适用于:Azure SQL 数据库

  • 要求具有 ##MS_ServerStateManager## 服务器角色的成员身份。

适用范围: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 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 和 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

请参阅