【问题标题】:Thoughts on index creation for SQL Server for missing indexes为缺少索引为 SQL Server 创建索引的思考
【发布时间】:2010-10-01 10:16:41
【问题描述】:

我正在调整我的 SQL Server 2008 数据库的性能,并正在使用各种 DMV 的输出来识别缺失的索引、未使用的索引等。

我主要使用这 3 个脚本(来自 SQLServerCentral.com),它们依赖于 SQL Server 提供的 DMV 数据:

The Ultimate Missing Index Finder

The Ultimate Duplicate Index Finder

The Ultimate Index Usage Reporter

在尝试创建新索引时,我知道我需要很聪明,并尝试通过创建恰到好处的方式将许多建议组合到尽可能少的索引中,以便它们能够出色地为几个不同的索引提供服务查询与为每个查询创建单独的索引,唯一的区别可能是包含的列等。

所以我想了解社区的想法,看看人们是否可以回答一些关于阅读 DMV 结果和构建新索引的问题。

索引中包含的列的顺序是否重要?

采取以下两个索引建议。你会怎么做才能让 1 适合两者?

object_name equality_columns                    inequality_columns              included_columns
    Appointment [FranchiseId], [AppointmentTypeId]  [CustomerId], [ApptDateTime]    NULL
    Appointment [FranchiseId], [AppointmentTypeId]  [ApptDateTime]                  [CustomerId]

如果我有很多索引建议具有相同的等式和不等式字段但包含的字段不同,那么是包含更多字段还是包含更少的字段更好?同样,目标是创建 1 个索引与 3 个(如果 3 个包含不同的列)。

最后,如果有任何好的资源可以为此类事情提供好的经验法则或一般指导方针,如果可以提供这些链接,我将不胜感激。

【问题讨论】:

  • 要做出正确的索引选择,您需要添加一些然后测试。如果它工作正常,然后停止。如果它不能正常工作,请尝试替代方案。很难说有一种万能的解决方案。这真的取决于使用模式。
  • 肯定明白。我希望最初在一个相当未索引的数据库上进行第一轮更改。我的第一次迭代我试图将表的 19 个索引建议缩小到尽可能少。我的计划肯定是添加,观察然后重新评估结果。

标签: sql sql-server-2008 indexing performance


【解决方案1】:

索引列的顺序很重要,但不包含列。这是因为只有键列用于查找。

您必须“阅读”大多数文档的字里行间,但这就是this BOL article 中所暗示的内容

This discussion 更明确地说顺序不重要。

几乎唯一关注索引中包含的列是空间 - 如果包含大量列或非常大的列,索引可能会变得非常大。但这意味着您绝对不想做两个单独的索引,每个索引都有相同的键列,但包含的键列不同。那么你只是在加剧你的空间问题。

【讨论】:

  • 完全清楚:索引上“包含”字段的全部意义在于它们可以在不影响索引的情况下更改。当这些值发生变化时,您不必在索引中移动记录,因此更新的开销更少。
  • 那么 2 个示例建议怎么样,你们怎么看?考虑到不等式列的差异,您将如何将其构建为 1 个索引?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
相关资源
最近更新 更多