sp_recompile (Transact-SQL)
适用于:SQL Server
Azure SQL 数据库 Azure SQL 托管实例
导致下次运行时重新编译存储过程、触发器和用户定义的函数。 它通过从过程缓存中删除现有计划来执行此操作,迫使下次运行过程或触发器时创建一个新计划。 在 SQL Server Profiler 集合中,将记录事件 SP:CacheInsert
而不是事件 SP:Recompile
。
语法
sp_recompile [ @objname = ] N'object'
[ ; ]
参数
[ @objname = ] N'object'
当前数据库中存储过程、触发器、表、视图或用户定义函数的限定或未限定的名称。 @objname为 nvarchar(776),没有默认值。
如果 @objname 是存储过程、触发器或用户定义的函数的名称,则下次运行时将重新编译存储过程、触发器或函数。
如果 @objname 是表或视图的名称,则下次运行时将重新编译引用表或视图的所有存储过程、触发器或用户定义函数。
返回代码值
0(成功)或非零数字(失败)
注解
sp_recompile
仅查找当前数据库中的对象。
仅当存储过程或触发器和用户定义的函数编译时,才会优化存储过程或触发器使用的查询。 对数据库进行了索引或其他会影响数据库统计的更改后,已编译的存储过程、触发器和用户定义函数可能会失去效率。 通过对作用于表上的存储过程和触发器进行重新编译,可以重新优化查询。
通常不需要主动执行此存储过程。 SQL Server 在有利的情况下自动重新编译存储过程、触发器和用户定义的函数。 数据库引擎可以选择重新编译对象有多种原因。 最常见的情况是,由于自动或手动统计信息更新,自动重新编译遵循对基础基数估计所做的更改。
使用每次执行重新编译存储过程是处理参数化导致的查询计划问题的效率较低的方法之一。 SQL Server 2022 (16.x) 中引入的功能 参数敏感计划优化 尝试自动缓解此问题。 在以前的版本中,不要每次执行调用 sp_recompile
,请考虑:
- 将 WITH RECOMPILE 选项 追加到查询,需要更改代码。
- 使用
WITH RECOMPILE
计划指南应用选项。 - 使用查询存储提示应用选项
WITH RECOMPILE
,而无需更改代码。 - 有关详细信息,请参阅 解决具有参数敏感计划问题的查询。
权限
需要具有对指定对象的 ALTER 权限。
示例
以下示例导致在下次运行时重新编译表的存储过程、触发器和用户定义的函数 Sales.Customer
。
USE AdventureWorks2022;
GO
EXEC sp_recompile N'Sales.Customer';
GO