拥有包含聚集索引中主键的非聚集索引是不是很糟糕?

时间:2010-04-30 20:00:32

标签: sql-server indexing clustered-index

如果在主键(int)上有一个带有聚簇索引的表,那么将一个(更多)非聚簇索引作为非主列之一包含该主键列是不是多余也不好 - 聚集索引?

4 个答案:

答案 0 :(得分:14)

实际上,可能有正当理由与群集索引创建非聚集索引相同。原因是聚集索引带有行数据的包袱,这可能会导致行密度非常差。 IE浏览器。由于群集密钥中没有宽字段,每页可以有2-3行,但聚簇索引键只有20个字节。在完全上具有与聚簇索引相同的密钥和顺序的非聚集索引将为每页提供2-3 数百密钥的密度。非聚集索引可以更有效地回答OLAP / BI工作负载的许多典型聚合查询,因为它可以将I / O减少数百倍。

对于包含群集密钥部分的非聚集索引,甚至是相同的密钥但顺序不同,所有的投注都会关闭,因为它们显然可以用于大量查询。

所以问题的答案是:它取决于

要获得更准确的答案,您必须分享您的表格的确切架构以及所涉及的确切查询。

答案 1 :(得分:4)

是的,通常没有必要,因为聚簇索引的列已经添加到非聚集索引中的每个索引条目中。

为什么呢?群集密钥的值实际上允许SQL Server“查找”一行数据 - 它是实际数据的“指针” - 所以很明显,它必须存储在非聚集索引中。如果您查找了“史密斯,约翰”,并且您需要了解有关此人的更多信息,则需要转到实际数据 - >这是通过在非聚集索引的索引节点中包含聚类键的值来完成的。

该聚簇键值已经存在,因此通常它是冗余的,并且不必再将该值显式地再次添加到非聚集索引中。这很糟糕,因为它只是浪费空间而不给你任何好处。

答案 2 :(得分:2)

我和Remus在一起 - 聚集索引实际上并不是一个索引 - 它告诉你如何在页面中组织数据。 (在你的情况下,它也是主键,但不需要是相同的东西)。非聚集索引包括行定位器信息,所以是的,它是多余的。

但是如果非聚集索引涵盖 ,则不需要使用数据行书签,可以使用它 lot 比聚簇索引更有效,效率随着数据行大小与非聚集索引大小的比率的增加而增加。

我发现如果你对查询工作负载中的访问路径有一个很好的处理,有时一些选择性覆盖非聚簇索引通常可以用来完全消除聚类选择 - 堆表,PK和一些好的非聚集索引,你已经完成了。

答案 3 :(得分:0)

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

其他索引可以帮助进行联接和排序(通常)。鉴于主键已经被索引,如果优化器可以基于它将使用它进行连接。

如果从连接/排序角度来看需要另一个索引,那么在索引组合中提供PK会有什么额外帮助?如果之前无法基于PK加入,那么现在就不行了。并且它也不会真正帮助任何排序。