如果您更新从未更新过的表的统计信息(不要问为什么它们从未更新),Server是否会根据过时的统计信息自动刷新执行计划?如果不这样做,最好的办法是什么?
发布于 2018-08-07 14:34:21
如果您更新了自上一次统计数据更新以来没有任何修改的表上的统计信息,则执行计划不会失效。
如果您在此和以前的统计数据更新之间更改了统计信息和数据,那么如果数据库将AUTO_UPDATE_STATISTICS数据库选项设置为ON,则它将失效。请注意,受影响的计划不会立即重新编译;每个计划将在下一次从缓存中检索以执行时重新编译。
参见肯德拉·利特尔的这篇文章:如果没有任何数据更改,更新统计信息是否会导致重新编译?
发现:仅凭统计更新并不能导致重新编译SQL Server就足以检查数据是否已更改。仅更新统计信息并不总是会使执行计划失效。
和引用不再可用的连接项的金伯利·特里普的这篇文章:
这不是窃听器,是故意的。而且,这实际上是有道理的。如果计划不应该失效(直接由于统计数据没有变化),那么它不会失效。如果应该对计划进行评估(统计数据已经更新并更改了数据),那么它将进行评估。
还请参阅Erin:统计与再培训的这篇文章,它引用了这个MSDN文档页
当AUTO_UPDATE_STATISTICS数据库选项设置为ON时,当查询的目标表或索引视图的统计信息已经更新或自上次执行以来基数发生了显著变化时,将重新编译它们。此行为适用于标准用户定义的表、临时表以及由DML触发器创建的插入和删除表。如果查询性能受到过多重新编译的影响,请考虑将此设置更改为OFF。当AUTO_UPDATE_STATISTICS数据库选项设置为OFF时,不会根据统计信息或基数更改进行重新编译,但由DML而不是触发器创建的插入和删除表除外。由于这些表是在tempdb中创建的,因此访问这些表的查询的重新编译取决于在tempdb中设置的AUTO_UPDATE_STATISTICS。请注意,在Server 2000中,查询继续根据DML触发器插入和删除表的基数更改重新编译,即使此设置已关闭。
因此,如果您想确保重新编译这些表的计划,则必须使用以下方法重新编译它们
sp_recompile 'tablename'https://dba.stackexchange.com/questions/214286
复制相似问题