存储过程何时重新编译?(Sql Server)

时间:2010-04-07 16:53:10

标签: sql-server-2005

我想,

当我在存储过程中使用临时表时,存储过程 将自动重新编译。

请给我其他可能性。

3 个答案:

答案 0 :(得分:3)

一切都在这里:Execution Plan Caching and Reuse在“重新编制执行计划”

部分下

答案 1 :(得分:3)

Optimizing SQL Server Stored Procedures to Avoid Recompiles

  • 删除并重新创建存储过程
  • 使用CREATE PROCEDURE或EXECUTE语句中的WITH RECOMPILE子句
  • 更改任何引用对象的架构
  • 针对存储过程引用的表
  • 运行sp_recompile系统存储过程
  • 还原包含存储过程或存储过程引用的任何对象的数据库
  • 存储过程计划从缓存中删除
  • 如果存储过程引用的表中有足够数量的行已更改,则存储过程将重新编译。 SQL Server将重新编译存储过程,以确保执行计划具有该表的最新统计信息。
  • 如果开发人员将数据定义语言操作与数据操作语言操作交错,则存储过程将重新编译。这通常是在整个代码中创建和引用临时对象时引起的。

答案 2 :(得分:0)

这里的其他2个答案(通过@KM。和@gbn)列出了SQL使缓存的计划“无效”的原因。

“无效”是指导致现有计划需要重新编译的原因。

但是,我认为重新编译的#1重复原因是缓存的计划不再存在。

这可能是由于:

  1. 缓存上的内存压力为新生成的计划腾出空间。
    也许您有大量随机的临时/准备好的脚本在运行,并且几乎没有空间保留为存储过程创建的计划
  2. 服务器已重置/重新启动
    这将清除您的tempdb 缓存
  3. 有人设置了例行作业来定期清除缓存
    (因为他们不知道自己在做什么)

以下是上面#3的重要链接(清除缓存的方法可以手动完成):

我从上面的链接中得出的结论是搜索您的工作和存储过程中是否包含以下内容:

  1. “ DBCC免费”
  2. “ DBCC FLUSH”
  3. “清除程序”

我曾经在各种数据库中工作过,很幸运能看到我的存储过程的缓存计划持续不超过24小时(通常少得多),所以到第二天,所有内容都需要重新编译。 / p>

根据我的经验,缓存可以工作,但是通常只在工作日几个小时之内,所以不要指望您的计划会持续到那以后。