必要时,强制重新编译存储过程的其他原因会阻碍存储过程编译的“参数查找”行为。当 SQL Server 执行存储过程时,该过程在编译时使用的任何参数值都作为生成查询计划的一部分包括在内。如果这些值就是后来调用存储过程时使用的典型值,则该存储过程在每次编译和执行时都会从查询计划中获益。否则,性能可能会受到影响。
注意:
SQL Server 2005 引入了对存储过程执行语句级重新编译功能。当 SQL Server 2005 重新编译存储过程时,只编译导致重新编译的语句,而不编译整个过程。因此,SQL Server 重新生成查询计划时,使用重新编译过的语句中的参数值。这些值可能与那些原来传递至过程中的值不同。
强制重新编译存储过程
SQL Server 中,强制重新编译存储过程的方式有三种:
sp_recompile 系统存储过程强制在下次执行存储过程时对其重新编译。
创建存储过程时在其定义中指定 WITH RECOMPILE 选项,指明 SQL Server 将不为该存储过程缓存计划,在每次执行该存储过程时对其重新编译。当存储过程的参数值在各次执行间都有较大差异,导致每次均需创建不同的执行计划时,可使用 WITH RECOMPILE 选项。此选项并不常用,因为每次执行存储过程时都必须对其重新编译,这样会导致存储过程的执行变慢。
如果只想在要重新编译的存储过程而不是整个存储过程中执行单个查询,请在要重新编译的每个查询中指定 RECOMPILE 查询提示。此行为类似于前文所述的 SQL Server 语句级重新编译行为,但除了使用存储过程的当前参数值外,RECOMPILE 查询提示还在编译语句时使用存储过程中本地变量的值。请仅在属于存储过程的查询子集中使用非典型值或临时值时使用此选项。有关详细信息,请参阅查询提示 (Transact-SQL)。
可以通过指定 WITH RECOMPILE 选项,强制在执行存储过程时对其重新编译。仅当所提供的参数是非典型参数,或自创建该存储过程后数据发生显著变化时,才应使用此选项。
注意:
如果删除或重命名了存储过程所引用的对象,那么在执行该存储过程时会返回错误。但如果用同名对象替换了存储过程中引用的对象,则可以不必重新创建即可执行该存储过程。
下次运行存储过程时对其重新编译
sp_recompile (Transact-SQL)