我在google上点击 auto_update_statistics ,它建议如果我们启用此功能,我们不需要更新统计信息,SQL Server就会这样做。
我想知道任何插入,更新(索引列),表上删除会导致更新统计?如果是,则不会为事务创建延迟。
答案 0 :(得分:2)
统计信息不会随插入/更新/删除操作本身一起更新。这些操作只是更新修改计数器,因此SQL Server可以跟踪已经有多少更改以及更新是否到期。
执行将使用统计信息的查询时,SQL Server会检查统计信息是否过时,并在需要时更新统计信息。
关于这个主题的最终文章是Plan Caching in SQL Server 2008(从中获取此流程图)
如前所述,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 column和traceflag 2371来修改行为。
如果AUTO_UPDATE_STATISTICS_ASYNC
为OFF
,那么在编译可以继续之前,请求spid会更新统计信息。如果此选项为ON
,那么统计信息将由后台系统spid更新,原始查询不会被阻止,只会继续使用过时的统计信息。
可以更新统计信息的另一种方法是,重建索引也会同时使用FULLSCAN
更新统计信息。