重新编译存储过程时,sp_recompile较ALTER PROCEDURE有额外作用吗?
sp_recompile 与 ALTER PROCEDURE 重新编译存储过程的差异
两者核心目标一致:都是让存储过程下次执行时重新生成执行计划,以此解决参数嗅探或过时执行计划导致的性能问题,但sp_recompile确实有几个ALTER PROCEDURE不具备的实用功能:
- 无需接触存储过程代码:执行
EXEC sp_recompile N'YourProcName'就能标记存储过程需要重新编译,不用写出完整的ALTER PROCEDURE脚本。这在你没有保存最新存储过程代码、或是不想冒误改代码风险的场景下,安全性和便捷性更高。 - 批量触发依赖对象编译:
sp_recompile不仅能作用于单个存储过程,还可以指定表或视图。比如执行EXEC sp_recompile N'YourTableName',所有依赖这张表的存储过程、触发器、用户定义函数都会被标记为需要重新编译——这比逐个修改依赖的存储过程高效太多。 - 轻量级标记,延迟编译:
sp_recompile只是修改存储过程的元数据状态,标记其需要重新编译,实际的编译操作会延迟到存储过程下次被调用时才执行;而ALTER PROCEDURE执行时会立即完成语法验证,但同样也是下次执行才生成新计划,不过前者的操作更轻量化,不会因编译占用即时资源。
当然,如果你本来就需要修改存储过程代码,那ALTER PROCEDURE可以一举两得——既更新代码又触发重新编译。但单纯为了清除执行计划、强制重新编译的话,sp_recompile是更灵活的选择。
内容的提问来源于stack exchange,提问作者Simon Elms
相关产品推荐
相关产品推荐

