聚簇索引查找和非聚簇索引查找之间的区别


10

聚集索引(CI)搜索和非聚集索引(NCI)搜索之间有什么区别?一个人比另一个人表现更好吗?

我之所以这样问,是因为我有一个具有5000万行和150列的表。它有一列名为ID定义为聚簇索引的列。还有一个具有相同索引键ID和七个include-d列的NCI 。在我看来,NC索引在这里是重复的,可以安全地删除。

因此,我想获得一些专家意见/建议,以确保可以安全地放下它或保持其完好无损?


您是说所有列都包含在无聚簇索引中吗?
伊恩·林格罗斯

否。该表中有150列,其中ID列定义为CI,并且它具有NCI索引,其中ID列又是索引键,而include中还有7列。
SQLPRODDBA'5

然后,Paul White似乎给出了正确的答案,但是我怀疑您是否应该将“基本”表从群集表更改为堆。甚至根据更新不同列的频率来拆分表,以减少事务日志记录的成本。
伊恩·林格罗斯

Answers:


26

与聚集索引具有相同键*的非聚集索引可能仍然有用,因为该非聚集索引通常会更小且更密集。请记住,聚集索引包含所有行内数据,因此它通常是可能的最宽(最小密度)索引。

*相同的键列,以相同的顺序,以相同的方式排序(asc / desc)。

对于单例查找(将相等谓词用于唯一索引的查找),主要区别是假定找到该单个记录已在内存中所需的索引页的机会更大。在所有条件都相等的情况下,具有100页的非聚集索引比存储在10,000页上的聚集索引有更好的机会。

对于除单例以外的任何其他类型的搜索,还将有一个扫描组件。扫描部分还将受益于更高的非聚集索引密度(每页更多行)。即使页面必须来自持久性存储,读取更少的页面也更快。

您应该检查系统文档,询问添加索引的人员,和/或寻找代码注释以了解为什么存在此索引。您还需要仔细检查完整的索引定义,包括压缩,并查看索引维护脚本。使用非聚集索引可能还有其他特殊原因(例如,可以在线重建)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.