【问题标题】:Any downside to "WITH RECOMPILE" for monthly SQL Server stored proc processes?每月 SQL Server 存储过程进程的“重新编译”有什么缺点吗?
【发布时间】:2008-12-04 22:13:33
【问题描述】:

我认为这个问题说明了一切。我在存储过程中有几个月度进程,需要一分钟到一小时不等。如果我声明它们WITH RECOMPILE,每次都会生成一个执行计划。

如果 DBA 更改了底层索引或统计信息或视图,我不希望任何人都必须进入并使用 ALTER 或其他方式强制重新编译 SP。

这有什么缺点吗?

【问题讨论】:

    标签: sql-server sql-server-2005 stored-procedures


    【解决方案1】:

    在这种情况下,这将是完全无害的,而且可能是个好主意。

    【讨论】:

      【解决方案2】:

      据我了解,如果需要,应该自动重新编译 SP。因此,您对潜在变化的关注并不重要。

      但是,服务器会尝试缓存已编译的 SP 计划。使用WITH RECOMPILE 将释放用于缓存已编译过程的内存(至少直到下一次缓存被清除)。由于它们只每月运行一次,这似乎是个好主意。

      此外,您可能想查看这篇文章以使用该指令的其他原因:
      https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5662581.html

      【讨论】:

      • 如果它可以使用更新、更好的索引,或者如果有新的统计数据——旧的计划会被自动丢弃吗?
      • 不,计划失效的唯一时间是计划使用的索引或统计信息被修改时。请参阅主题“执行计划缓存和重用”(在索引中查找“过程缓存”),联机丛书中的“重新编译执行计划”部分,了解有关使计划无效的更多详细信息。
      【解决方案3】:

      如果每个存储过程每个月只运行一次,那么已编译的过程不太可能仍然在过程缓存中。实际上它无论如何都会重新编译。

      即使您在报告日运行相同的存储过程 100 次,每次编译也只需要 0-2 秒(取决于存储过程的复杂性),因此开销并不大。在这些存储过程上设置 WITH RECOMPILE 我会觉得很舒服。

      【讨论】:

      • 对 - 我认为重新编译时间与运行时间相比总是可以忽略不计 - 运行时间限制了我如此频繁地运行这些进程,甚至可能是一个因素。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多