如何在 SQL Server 中手动重新编译存储过程?就像一个drop
和create
?
我知道可以使用 create 语句中的一个选项来完成它(WITH RECOMPILE)
,并且每次执行都会重新编译它,并且正在执行sp_recompile @procedureName
,它只会在下次执行时重新编译它,但是如果没有这两种方法,我该如何手动重新编译它呢?
如何在 SQL Server 中手动重新编译存储过程?就像一个drop
和create
?
我知道可以使用 create 语句中的一个选项来完成它(WITH RECOMPILE)
,并且每次执行都会重新编译它,并且正在执行sp_recompile @procedureName
,它只会在下次执行时重新编译它,但是如果没有这两种方法,我该如何手动重新编译它呢?
存储过程在“第一次”执行时被编译。“第一”的意思,他们没有计划。您所能做的就是使缓存无效。在 SQL-Server 中,除了调用它之外,没有办法强制编译。
(顺便说一句,这与 Oracle 不同,您可能从那里得到了这个想法)
在我们的应用程序中,我们维护一个名为“run_sample_statements.sql”的脚本。这包含许多有代表性的查询和过程调用,以导致编译和缓存。我们在维护和索引重建之后使用它来测试/预缓存系统,然后再为用户发布它。
好吧,一种方法是通过查询找到计划句柄
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 相同。