非聚集索引,包括列

时间:2015-10-23 19:17:59

标签: sql sql-server indexing

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

但是,如果查询是SELECT *,我应该将所有列包括在索引中吗?我知道我正在制作整张桌子的副本,这是好事还是坏事?

1 个答案:

答案 0 :(得分:1)

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

如果你必须对表格中的大部分行进行密钥查找,那么扫描整个表格通常要快得多。在您的场景中也很可能就是这种情况,因为如果没有多少行影响,那么进行密钥查找就不会那么昂贵,因此索引所有字段并不会真正有用。< / p>

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