【发布时间】:2008-12-04 22:13:33
【问题描述】:
我认为这个问题说明了一切。我在存储过程中有几个月度进程,需要一分钟到一小时不等。如果我声明它们WITH RECOMPILE,每次都会生成一个执行计划。
如果 DBA 更改了底层索引或统计信息或视图,我不希望任何人都必须进入并使用 ALTER 或其他方式强制重新编译 SP。
这有什么缺点吗?
【问题讨论】:
标签: sql-server sql-server-2005 stored-procedures
我认为这个问题说明了一切。我在存储过程中有几个月度进程,需要一分钟到一小时不等。如果我声明它们WITH RECOMPILE,每次都会生成一个执行计划。
如果 DBA 更改了底层索引或统计信息或视图,我不希望任何人都必须进入并使用 ALTER 或其他方式强制重新编译 SP。
这有什么缺点吗?
【问题讨论】:
标签: sql-server sql-server-2005 stored-procedures
在这种情况下,这将是完全无害的,而且可能是个好主意。
【讨论】:
据我了解,如果需要,应该自动重新编译 SP。因此,您对潜在变化的关注并不重要。
但是,服务器会尝试缓存已编译的 SP 计划。使用WITH RECOMPILE 将释放用于缓存已编译过程的内存(至少直到下一次缓存被清除)。由于它们只每月运行一次,这似乎是个好主意。
此外,您可能想查看这篇文章以使用该指令的其他原因:
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5662581.html
【讨论】:
如果每个存储过程每个月只运行一次,那么已编译的过程不太可能仍然在过程缓存中。实际上它无论如何都会重新编译。
即使您在报告日运行相同的存储过程 100 次,每次编译也只需要 0-2 秒(取决于存储过程的复杂性),因此开销并不大。在这些存储过程上设置 WITH RECOMPILE 我会觉得很舒服。
【讨论】: