【问题标题】:Non-clustered index including columns包含列的非聚集索引
【发布时间】:2015-10-23 19:17:58
【问题描述】:

假设我有一个包含许多列(例如 20 列)的表格,我经常按其中之一进行搜索。如果我为该列创建非聚集索引,那么我知道我还应该包括 select 语句中的其他列以覆盖查询。

但是如果查询是SELECT *,我应该包含所有要索引的列吗?我知道我这样做是在复制整个表格,这是好的还是坏的做法?

【问题讨论】:

  • “我知道这样做是在复制整个表格”
  • @Lamak:Eish,苛刻,老兄......

标签: sql sql-server indexing


【解决方案1】:

索引大部分/整个表通常不是一个好主意,特别是如果表中有插入/更新/删除。当索引中未包含所有需要的字段时,必须使用聚集索引进行键查找以从表中查找行。这有多好/坏取决于您要获取的行数以及聚集索引中有多少级别 - 这就是为什么最好有一个窄的聚集键,最好是一个 int。

如果您必须对表中的大部分行进行键查找,通常只扫描整个表会快得多。在您的场景中也很可能是这种情况,因为如果没有太多行受到影响,进行键查找不会那么昂贵,因此索引所有字段并没有真正的帮助。

当然,如果您的表很大,索引所有列可能会有所帮助,至少在理论上是这样。我什至从未考虑过这样做,但我认为扫描整个表将是一项昂贵的操作时会有所帮助。这当然只是在表没有得到太多更新的情况下,因为维护索引也会导致问题。

【讨论】:

  • 这假设您在表上有一个聚集索引,在查找时堆的行为略有不同
  • 感谢您的回答,只有一件事我不明白。当非聚集索引查找完成时,我想我们有一个聚集索引 ID 的列表,然后对这些 ID 中的每一个进行键查找。但是为什么这个手术这么贵呢?这些查找和聚集索引查找有什么区别?
  • 您正在执行聚集索引查找的次数与行数一样多。一个键查找还不错,但一百万个键查找可能不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 2013-04-04
相关资源
最近更新 更多