本主题介绍如何使用 Transact-SQL 在 SQL Server 2014 中重新编译存储过程。 有三种方法可以执行此操作:在过程定义中设置 WITH RECOMPILE 选项或在调用过程时使用它、在单个语句上添加 RECOMPILE 查询提示,或者使用 sp_recompile 系统存储过程。 本主题介绍在创建过程定义和执行现有过程时使用 WITH RECOMPILE 选项。 它还介绍了如何使用sp_recompile系统存储过程重新编译现有过程。
本主题内容
准备工作:
若要重新编译存储过程,请使用:
在您开始之前
建议
首次编译或重新编译过程时,该过程的查询计划针对数据库的当前状态及其对象进行了优化。 如果数据库的数据或结构发生重大更改,重新编译会更新并优化过程的查询计划以适应这些更改。 这可以提高该过程的处理性能。
有时必须强制进行过程重新编译,而有时则会自动进行重新编译。 每当重新启动 SQL Server 时,都会出现自动重新编译。 如果过程引用的基础表进行了物理设计更改,也会发生这种情况。
强制重新编译过程的另一个原因是抵消过程编译的“参数探查”行为。 当 SQL Server 执行过程时,该过程编译时使用的任何参数值都包含在生成查询计划的一部分。 如果这些值表示过程随后调用的典型值,则该过程在每次编译和执行时都受益于查询计划。 如果过程中的参数值经常是非典型值,则强制重新编译过程和基于不同参数值的新计划可以提高性能。
SQL Server 支持过程的语句级重新编译。 当 SQL Server 重新编译存储过程时,仅编译导致重新编译的语句,而不是完整过程。
如果过程中的某些查询定期使用非典型值或临时值,则可以在这些查询中使用 RECOMPILE 查询提示来改进过程性能。 由于仅重新编译使用查询提示的查询,而不是完整过程,因此将模拟 SQL Server 的语句级重新编译行为。 但是,除了使用过程的当前参数值外,RECOMPILE 查询提示在编译语句时还使用存储过程内任何局部变量的值。 有关详细信息,请参阅查询提示(Transact-SQL)。
安全
权限
WITH RECOMPILE 选项
如果在创建过程定义时使用此选项,则需要在数据库中具有 CREATE PROCEDURE 权限,并且需要对在其中创建该过程的架构具有 ALTER 权限。
如果在 EXECUTE 语句中使用此选项,则需要对该过程具有 EXECUTE 权限。 EXECUTE 语句本身不需要权限,但对 EXECUTE 语句中引用的过程需要执行权限。 有关详细信息,请参阅 EXECUTE (Transact-SQL)。
RECOMPILE 查询提示
当创建过程并且在过程中的 Transact-SQL 语句中包含提示时,将使用此功能。 因此,它在数据库中需要 CREATE PROCEDURE 权限,并且需要对在其中创建该过程的架构具有 ALTER 权限。
sp_recompile 系统存储过程
需要对指定过程具有 ALTER 权限。
使用 Transact-SQL
使用 WITH RECOMPILE 选项重新编译存储过程
连接到数据库引擎。
在标准栏中,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。 此示例创建过程定义。
USE AdventureWorks2012;
GO
IF OBJECT_ID ( 'dbo.uspProductByVendor', 'P' ) IS NOT NULL
DROP PROCEDURE dbo.uspProductByVendor;
GO
CREATE PROCEDURE dbo.uspProductByVendor @Name varchar(30) = '%'
WITH RECOMPILE
AS
SET NOCOUNT ON;
SELECT v.Name AS 'Vendor name', p.Name AS 'Product name'
FROM Purchasing.Vendor AS v
JOIN Purchasing.ProductVendor AS pv
ON v.BusinessEntityID = pv.BusinessEntityID
JOIN Production.Product AS p
ON pv.ProductID = p.ProductID
WHERE v.Name LIKE @Name;
使用 WITH RECOMPILE 选项重新编译存储过程
连接到数据库引擎。
在标准栏中,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。 此示例创建一个简单的过程,从视图中返回所有员工(名字和姓氏)、职务及其部门名称。
然后将第二个代码示例复制并粘贴到查询窗口中,然后单击“ 执行”。 这会执行该过程并重新编译过程的查询计划。
USE AdventureWorks2012;
GO
EXECUTE HumanResources.uspGetAllEmployees WITH RECOMPILE;
GO
使用 sp_recompile 重新编译存储过程
连接到数据库引擎。
在标准栏中,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。 此示例创建一个简单的过程,从视图中返回所有员工(名字和姓氏)、职务及其部门名称。
然后,将以下示例复制并粘贴到查询窗口中,然后单击“ 执行”。 这不会执行该过程,但它会标记要重新编译的过程,以便在下次执行该过程时更新其查询计划。
USE AdventureWorks2012;
GO
EXEC sp_recompile N'HumanResources.uspGetAllEmployees';
GO
另请参阅
创建存储过程
修改存储过程
重命名存储过程
查看存储过程的定义
查看存储过程的依赖关系
DROP PROCEDURE (Transact-SQL)