sp_recompile (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

导致下次运行时重新编译存储过程、触发器和用户定义的函数。 它通过从过程缓存中删除现有计划来执行此操作,迫使下次运行过程或触发器时创建一个新计划。 在 SQL Server Profiler 集合中,将记录事件 SP:CacheInsert 而不是事件 SP:Recompile

Transact-SQL 语法约定

语法

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 ,请考虑:

权限

需要具有对指定对象的 ALTER 权限。

示例

以下示例导致在下次运行时重新编译表的存储过程、触发器和用户定义的函数 Sales.Customer

USE AdventureWorks2022;
GO
EXEC sp_recompile N'Sales.Customer';
GO

另请参阅

后续步骤