SQL Server:索引中包含的列:是否有“太多”之类的内容?

Eri*_*rak 5 index sql-server

我们的一个数据库中有一张表,其结构大致如下:

Field1 int primary key
Field2 int foreign key A
Field3 int foreign key B
Field4 int foreign key C
Field5 ... Field70 diverse data types, for the "payload"
Run Code Online (Sandbox Code Playgroud)

外键列上有索引,尽管只有键列,没有任何包含的列。索引分析例程不断建议具有相同键列的新索引,这些列已经存在索引,但包含许多列 - 在一种情况下甚至是所有 Field5 到 Field70。我有点犹豫是否要创建包含如此多列的索引 - 感觉就像复制表本身。

对于索引中包含的列的数量是否有一些经验法则限制,或者我应该继续将现有索引(仅键列)替换为具有相同键列和如此多包含列的索引?

提前致谢。

spa*_*dba 3

建议的索引总是倾向于包含访问数据的查询所需的尽可能多的列,以便具有覆盖索引并消除查找的需要。

这是好事还是坏事,只有你自己才能知道。这在很大程度上取决于您的工作负载的形状。一些查询将从覆盖索引中受益匪浅,而另一些查询则几乎不会得到改善。

将列包含在非聚集索引中还意味着每当您更改这些列中的数据时,更改也必须写入索引。广泛的索引是有成本的。

也有可能其中一些列最好放置在索引键内而不是包含在内。某些查询可能会受益于索引中的有序数据。

确定的唯一方法是基准测试:

  1. 捕获生产工作负载并将其与备份同步
  2. 将备份恢复到您的测试服务器
  3. 针对测试服务器运行工作负载并分析性能指标和执行时间
  4. 将您认为对索引有意义的更改应用
  5. 重播工作负载
  6. 比较性能
  7. 冲洗并重复

没有其他方法可以确定。

  • 聚集索引也可能设计得不好,修改它可以提供重大的性能改进。@ErichHorach - 查看索引统计信息以了解如何使用聚集索引和其他索引。 (2认同)