我是否正确地说统计仅在为存储过程创建执行计划时使用,而没有在实际执行上下文中使用?
不,发生的事情是存储过程的执行计划被缓存了。假定有足够的可用内存来继续保存该计划,除非发生以下情况之一,否则它不会更改(来自SQL Server文档中的执行计划缓存和重用,重点是增加):
- 对查询所引用的表或视图的更改(ALTER TABLE和ALTER VIEW)。
- 对单个过程进行的更改将导致从缓存中删除该过程的所有计划(ALTER PROCEDURE)。
- 更改执行计划使用的任何索引。
- 执行计划使用的统计信息的更新,可以从一条语句(例如UPDATE STATISTICS)显式生成,也可以自动生成。
- 删除执行计划使用的索引。
- 对sp_recompile的显式调用。
- 键的大量更改(由其他用户修改查询所引用表的INSERT或DELETE语句生成)。
- 对于带有触发器的表,如果插入或删除的表中的行数显着增加。
- 使用WITH RECOMPILE选项执行存储过程。
因此,如果统计信息已更新,则缓存的计划将自动考虑新统计信息并重新编译。
当每天增加十万行时,如何防止执行计划变得过时?
如上所述,一种方法是对表进行大量更新。数十万个更改的行可能满足此条件。但是,如果您想确定还是要进行更精细的控制,请执行以下操作:通过更新统计信息。您可以允许SQL Server自动创建和管理统计信息,也可以自己手动执行。您可以在SQL Server自动更新和自动创建统计信息选项中找到有关这两种方法的更多信息。当/如果您每周重建索引,这也会触发计划也被更新。做一些测试,看看什么对您最有利,因为经常更新统计信息可能不会产生任何实际的性能结果。
如果我们经常更新统计信息以解决此问题,那么在此存储过程的查询中使用OPTION(RECOMPILE)提示是否有意义?
您无需使用RECOMPILE
,因为根据上面的摘录,您可以看到只要有新的统计数据,执行计划就会得到适当更新。一天结束时更新统计信息可能会很好(如果您真的很担心),但是根据您到目前为止的发言,我认为这显然不是必需的。再次,尽管如此,我将对其进行测试,以查看这可能会对您的存储过程性能产生什么影响并做出相应的计划。
RECOMPILE
无论如何不会导致统计信息更新。