如何在SQL Server中手动重新编译存储过程?就像drop
和create
?
我知道可以在create语句(WITH RECOMPILE)
中使用一个选项来执行它,并且每次执行都会重新编译它,并执行sp_recompile @procedureName
,它只会在下次执行时重新编译它,但是如何执行我可以在没有这两种方法的情况下手动重新编译它吗?
答案 0 :(得分:3)
存储过程在“首次”执行时编译。 “第一”意思是,他们没有主导计划。您所能做的就是使缓存无效。在SQL-Server中,除了调用它之外,没有办法强制编译。
(顺便说一句,这与Oracle不同,你可能从中得到了这个想法)
在我们的应用程序中,我们维护一个名为“run_sample_statements.sql”的脚本。这包含许多有代表性的查询和过程调用,以引起编译和缓存。我们在维护和索引重建之后使用它来测试/预先缓存系统,然后再为用户发布它。
答案 1 :(得分:0)
嗯,一种方法是通过查询来找到计划句柄
Select st.Plan_handle
from
sys.dm_exec_cached_plans
CROSS APPLY
sys.dm_exec_sql_text(plan_handle) st
WHERE text like '% your proc name %'
然后是DBCC FREEPROCCACHE(plan_handle)
此方法实际上与sp_recompile相同。