主键是否始终聚集?

时间:2009-02-24 11:59:37

标签: sql sql-server indexing primary-key

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

2 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:10)

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

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

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