非聚集索引包含聚集索引的主键是否有害?

7

如果您在主键(int)上有一个聚集索引的表,那么在非聚集索引中包含该主键列作为非聚集索引中的一列是否多余和不好?

4个回答

14
实际上,创建一个与聚集索引完全相同的非聚集索引是有合理原因的。原因在于,聚集索引携带了行数据的负担,这可能会导致非常低的行密度。例如,由于没有在聚集键中的宽字段,每页可能只有2-3行,但聚集索引键却仅为20个字节。在完全相同的键和顺序上具有非聚集索引将使每页密度达到2-3 个键。对于OLAP / BI工作负载典型的许多聚合查询,非聚集索引可以更有效地回答,因为它将I/O减少了数百倍。
至于包含聚集键部分或甚至相同键但顺序不同的非聚集索引,那么一切都未可知,因为它们显然可以用于多种查询。
所以你问题的答案是:取决于具体情况
要得到更精确的答案,你需要分享你表格的确切架构和涉及的确切查询。

4
通常情况下是不必要的,因为聚集索引的列已经添加到非聚集索引中的每个索引条目中。
为什么呢?聚集键值是真正允许SQL Server“查找”数据行的值 - 它是指向实际数据的“指针” - 所以显然它必须存储在非聚集索引中。如果您查找了“Smith, John”并且需要了解更多关于此人的信息,则需要访问实际数据-->这是通过将聚集键的值包含在非聚集索引的索引节点中来完成的。
由于聚集键值已经存在,因此通常将其显式地添加到非聚集索引中是多余和不必要的。这样做会浪费空间而不给您带来任何好处。

2
我赞同Remus的观点——聚集索引并不真正是一个索引,它告诉你数据在页面中的组织方式。(在您的情况下,这也是主键,但这并非必须相同)。非聚集索引包括该行定位器信息,因此是多余的。
但是,如果非聚集索引覆盖且不需要使用数据行书签,则可以比聚集索引更有效地使用,随着数据行大小与非聚集索引大小之比增加,效率也会提高。
我发现,如果您对查询工作负载中的访问路径有很好的掌握,有时几个选择性的覆盖非聚集索引通常可以用来完全消除聚集选择——堆表、主键和一些良好的非聚集索引,这样就完成了。

0

没有100%的答案,但答案几乎肯定是这样的。

其他索引的存在是为了帮助连接和排序(通常情况下)。鉴于主键已经被索引,如果优化器可以基于此进行连接,它将使用该索引。

如果需要从连接/排序角度考虑另一个索引,那么在索引中混合PK会提供什么额外的帮助呢?如果以前不能基于PK进行连接,现在也不会。而且它对排序也没有什么帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接