我在 google 上找到了auto_update_statistics,它建议如果我们将其设为 ON,我们不需要更新Statistics,SQL Server 会这样做。
我想知道对于表上的任何插入、更新(索引列)、删除都会导致统计信息的更新吗?如果是,则不会为事务创建延迟。
我在 google 上找到了auto_update_statistics,它建议如果我们将其设为 ON,我们不需要更新Statistics,SQL Server 会这样做。
我想知道对于表上的任何插入、更新(索引列)、删除都会导致统计信息的更新吗?如果是,则不会为事务创建延迟。
统计信息不会与插入/更新/删除操作本身一起更新。这些操作只是更新一个修改计数器,因此 SQL Server 可以跟踪有多少更改以及更新是否到期。
当执行将使用统计信息的查询时,SQL Server 检查统计信息是否过时并在需要时更新统计信息。
关于该主题的权威文章是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 不存在。因此,不会因为表变量的基数变化而发生重新编译。
这些重新编译阈值并不适用于所有情况。例如,请参阅统计、行估计和升序日期列和跟踪标志 2371可用于修改行为。
如果AUTO_UPDATE_STATISTICS_ASYNC
是,OFF
那么在编译可以继续之前,请求 spid 会更新统计信息。如果选择此选项,ON
则系统 spid 在后台更新统计信息,原始查询不会被阻止,而只是继续使用陈旧的统计信息。
可以更新统计信息的另一种方法是重建索引也将同时更新统计信息FULLSCAN
。