如果通过对表的特定索引使用sp_autostats使auto_update_statistics为ON,那么每个DML的统计信息是什么?

时间:2012-07-04 09:33:19

标签: sql sql-server tsql statistics dml

我在google上点击 auto_update_statistics ,它建议如果我们启用此功能,我们不需要更新统计信息,SQL Server就会这样做。

我想知道任何插入,更新(索引列),表上删除会导致更新统计?如果是,则不会为事务创建延迟。

1 个答案:

答案 0 :(得分:2)

统计信息不会随插入/更新/删除操作本身一起更新。这些操作只是更新修改计数器,因此SQL Server可以跟踪已经有多少更改以及更新是否到期。

执行将使用统计信息的查询时,SQL Server会检查统计信息是否过时,并在需要时更新统计信息。

关于这个主题的最终文章是Plan Caching in SQL Server 2008(从中获取此流程图)

enter image description here

如前所述,SQL Server维护对每列进行的修改次数。如果自编制计划以来的修改数超过重新编译阈值(RT),则将重新编译计划并更新统计信息。 RT取决于表格类型和大小。

  

RT计算如下。 (n在编译查询计划时引用表的基数。)

     

永久表
   - 如果n <= 500,则RT = 500    - 如果n> 500,RT = 500 + 0.20 * n。

     

临时表
   - 如果n < 6,RT = 6    - 如果6 <= n <= 500,则RT = 500    - 如果n> 500,RT = 500 + 0.20 * n。
  表变量
   - RT不存在。因此,由于表变量的基数发生变化,不会发生重新编译。

这些重新编译阈值并不适合所有情况。例如可以使用Statistics, row estimations and the ascending date columntraceflag 2371来修改行为。

如果AUTO_UPDATE_STATISTICS_ASYNCOFF,那么在编译可以继续之前,请求spid会更新统计信息。如果此选项为ON,那么统计信息将由后台系统spid更新,原始查询不会被阻止,只会继续使用过时的统计信息。

可以更新统计信息的另一种方法是,重建索引也会同时使用FULLSCAN更新统计信息。