主键是否始终聚集?

The*_*iot 16 sql sql-server indexing primary-key

请清除我对此的疑问,在SQL Server(2000及以上版本)中主键自动聚类索引还是我们可以选择在主键上使用非聚集索引?

Meh*_*ari 25

不,它可以是非聚集的.但是,如果您没有将其显式定义为非聚集且表上没有聚簇索引,则它将被创建为聚簇.


Chr*_*eld 10

有人可能还会补充说,经常让主键成为群集是很糟糕的.特别是,当主键由IDENTITY分配时,它没有内在含义,因此任何保持表格相应排列的努力都将被浪费.

考虑一个表Product,其中包含ProductID INT IDENTITY PRIMARY KEY.如果这是集群的,则以某种方式相关的产品可能会遍布整个磁盘.最好通过我们可能基于的东西进行聚类,比如ManufacturerID或CategoryID.在任何一种情况下,聚集索引(其他条件相同)会使相应的查询更有效.

另一方面,子表中指向此的外键可能是群集的良好候选者(我的反对意见是实际具有IDENTITY属性的列,而不是其亲属).因此,在上面的示例中,可能是ManufacturerID是Manufacturer表的外键,其中它被设置为IDENTITY.列不应该是群集的,但Product中引用它的列可能会很好地实现.

  • @CF - 这不是集群的理由.如果您基于该主键进行查询,则其索引将为您提供帮助.并且可能更快,因为与聚集索引中的行的全宽相比,几乎可以肯定需要更少的IO来通过相对窄的索引. (2认同)