【问题标题】:Why are these SQL Server statistics outdated, when it's set to auto-update?为什么这些 SQL Server 统计信息设置为自动更新时会过时?
【发布时间】:2017-08-16 06:00:52
【问题描述】:

我们有一个 SQL Server 2012 实例,数据库的自动统计设置为 ON:

但是后来我运行了一个查询来检查一些统计信息,并且 有些 有一段时间没有更新了:

  1. 为什么会这样? SQL Server 是否更新这些索引未触发的统计信息是否有规则?
  2. 我需要照顾吗?我如何知道我是否需要更新它们,或者它们是否会给我带来性能问题?

谢谢!

【问题讨论】:

  • 您确定表格有更改吗?是所有统计数据都错误,还是仅针对某些表,如果只是某些表,它们有什么共同点?

标签: sql-server sql-server-2012 sqlperformance database-indexes


【解决方案1】:

即使您将自动更新统计信息设置为 true,它们也只会在达到阈值时更新..这对于不同的版本是不同的

SQL Server 2012 或更早版本的阈值:

  1. 表格大小已从 0 变为 > 0 行

  2. 统计时表中的行数为500或更少,并且统计对象的前导列的colmodctr变化超过500

  3. 统计时表超过500行,统计对象前导列colmodctr变化超过500+统计时表行数的20%被收集了

对于 SQLServer 2016,很少有重大更改和使用新算法的 SQL 更新统计信息(阅读频率高于旧版本)

我需要关心吗?我如何知道我是否需要更新它们,或者它们是否会给我带来性能问题?

通常人们会在周末安排维护工作,这包括索引重建/统计更新..

这通常可以处理大多数数据库。在您的情况下,如果您发现由于无效统计信息导致的性能问题,您可以手动更新它们。我们每周更新一次,但sites like StackOverflow does it more often

update stats tablename

进一步阅读/参考:
Statistics Used by the Query Optimizer in Microsoft SQL Server 2008
Understanding When Statistics Will Automatically Update

【讨论】:

  • 谢谢..这是有道理的。其中一些表不那么活跃,所以它是有道理的。另外两个问题:1)“通常人们会在周末安排维护工作,这包括索引重建/统计更新..”。我了解手动重建索引的必要性,但如果 AUTO STATS 开启,我不需要手动更新统计信息,对吗? 2)“如果您看到由于无效统计数据导致的性能问题”。我如何知道我的表现问题是否与无效统计数据有关?我似乎记得一些关于“估计与实际行”的事情。
  • 更新统计信息会导致大量 IO,因此在休息日进行调度是我认为关闭的原因之一。第二个是如果 sql 在执行时发现查询的统计信息不是最新的,查询执行会暂停一小段时间,直到重建统计数据
  • 谢谢。为了清楚起见 - 您的第一条评论意味着关闭 off AUTO STATS 并在休息日手动执行,对吗?
  • 我不是那个意思,你可以继续使用它,它也有助于为非索引列创建统计信息
猜你喜欢
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2011-10-30
  • 1970-01-01
  • 2010-11-01
  • 2010-10-24
  • 1970-01-01
相关资源
最近更新 更多