【发布时间】: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