【问题标题】:MS SQL index rebuild fixes timeoutsMS SQL 索引重建修复超时
【发布时间】:2014-09-17 11:55:50
【问题描述】:

我们有一个 MS SQL 查询,它在连接方面相当复杂。它的目的是搜索特定类型的实体。我们最近花了一些时间优化它并设置正确的索引。

虽然在某些时间点(没有注意到任何规则,所以看起来很随意),Web 应用程序在使用此查询时开始超时。然后我们可以进入数据库并重建 SQL 中包含的 2 个表的索引,然后它恢复正常......这种情况偶尔会发生。

现在请原谅我的无知,MSSQL 是否应该在最佳时间自行重建索引? 否则,一旦我们遇到一定程度的碎片,我们是否需要安排索引维护运行? 请随意忽略我的问题并引导我朝着正确的方向前进。

提前致谢。

【问题讨论】:

  • 也许表统计信息消失了?当索引字段的值分布“倾斜”时,可能会发生这种情况——比如 50% 的记录具有相同的值,而其他 50% 的值都不同——并且添加记录不遵循相同的模式。重建索引会重新创建统计信息 - 但更简单的方法是“使用全扫描更新统计信息 mytable”。 SQL 服务器本身会自动更新表统计信息(如果没有禁用),但它不会使用所有记录进行采样;这个“全扫描”提示强制对所有数据进行采样。
  • 下次出现问题时,我将尝试只运行UPDATE STATISTICS mytable。或者有没有其他方法来分析表统计信息是否消失,即日志?
  • 查看Ola Hallengren的优秀索引维护文章
  • “MSSQL 是否应该在最佳时间自行重建索引?” - 不是。它根据启发式阈值自动更新统计信息。您需要实施维护计划(标准 DBA 面包)
  • @MitchWheat,有没有办法知道(在某些时间点)应该更新统计数据?抱歉,这听起来像是一个绝对新手的问题

标签: sql-server sql-server-2008 indexing


【解决方案1】:

生产系统应该有定期的统计维护,可能还有一些不那么频繁的索引维护。

由于 SQL Server (当前)没有开箱即用地为您执行此操作,因此请实施 Ola Hallegren's Index and Statistics Maintenance scripts。 DBA 使用这些。

我以前每周重建索引,但现在更喜欢每晚更新统计信息,并且执行较少的索引重建。

我实施了所有碎片索引的每周重建 (> 50%) 和夜间作业 (如果需要) 以维护大量使用 (并大量插入) 表。所有碎片索引 (> 50%) 和每晚工作(在需要时)维护大量使用(并大量插入)表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多