创建包含所有列的索引是否有意义

Luk*_*Led 7 sql-server index-tuning nonclustered-index

我们有一个带列的表

 ID
 OtherTableId
 DataA
 DataB
 DataC
 DataD
Run Code Online (Sandbox Code Playgroud)

OtherTableID INCLUDE (ID, DataA, DataB, DataC, DataD)当我们需要所有列时创建索引是否有意义,还是仅在上创建索引就足够了(OtherTableID)

我知道带有 include 的索引会有效地复制表大小,但它会提高性能吗?

查询是:

select * from Table Where OtherTableID = ?
Run Code Online (Sandbox Code Playgroud)

Dan*_*her 6

如果

  • 您的查询使用所有这些字段,
  • 排序顺序需要与聚集索引的排序顺序不同,并且
  • 您无法更改聚集索引,

具有不同列顺序的附加(覆盖)索引可能适合您。与任何与索引相关的事情一样,更多(和更宽)的索引意味着更慢的写入/更新性能。如果您实际上将表的大小加倍,则尤其如此。

如果您只是索引OtherTableId而不包含其他列,您将得到一个较小的索引,但您的查询最终可能只是使用带有昂贵的扫描或排序运算符的聚集索引,或者使用来自非聚集索引的键查找,这可能是如果您一次只查询几行,那么这很好,但如果您要扫描整个表,那就是灾难性的。

这是一般建议。有关具体信息,请编辑您的问题以包括查询、表定义和查询计划。