1.每次存储过程执行时重新编译
当存储过程的计划自动或显式重建的时候就会发生重新编译。当存储过程中引用的基础表或其他对象发生改变后,存储过程就会在其执行期间自动重新编译。计划使用的索引发生变动或者存储过程引用的表键发生了大量的更新也可能引起重新编译。自动重新编译的目的足确保SQL Servcr执行计划使用最新的信息,不使用过期的假设架构和数据。
SQL Server在存储过程中使用语句级别的重新编译,而不是重新编译整个存储过程。重新编译在生成新计划的时候会引起额外的负载,而语句级别的重新编译能减小这种负载,因为它只纠正需要纠正的地方。
尽管重新编译代价很高,并且应该在大多数时候避免,但是有时候你的存储过程还是有需要强制重新编译的理由。例如,由于限定列不同的选择性,存储过程可能基于调用它的应用程序生成差异很大的查询结果——以至于保留的执行计划在使用不同的输入参数时会引起性能问题。
例如,如果一个参数指定的城市返回一百万行,而另外一个城市值返回一行,SQL Server可能就没必要缓存正确的执行计划了。可能最终缓存的计划是为一行优化的而不是一百万行,这样会引起很长的查询执行时间。如果你觉得除了缓存之外存储过程还在其他地方有用,就可以使用WITH RECOMPILE命令。
示例:强制存储过程在每次执行的时候重新编译:
USE AdventureWorks
GO
CREATE PROC dbo.usp_SEL_BackupMBsPerSecond
(@BackupStarDate datetime,
@BackupFinishDate datetime)
WITH RECOMPILE --从不保存计划
AS
--衡量db备份吞吐量
SELECT (SUM(backup_size)/1024)/1024 as 'MB',
DATEDIFF(SS,MIN(backup_s