主键是否总是聚集的?

20
请帮我解答这个疑问,在 SQL Server 2000 及以上版本中,主键是否自动聚集索引,或者我们可以选择在主键上有非聚集索引?
2个回答

29

不是必须聚集索引,也可以是非聚集索引。但如果没有明确定义为非聚集索引并且表上没有聚集索引,则会作为聚集索引创建。


12

有时,允许主键成为聚集索引是不好的。特别是当主键由IDENTITY分配时,它没有内在含义,因此任何按照表格排列的努力都将白费。

考虑一个Product表,其中ProductID INT IDENTITY PRIMARY KEY。如果将其聚集,则相关产品很可能分散在整个磁盘中。最好根据我们可能基于的某些内容进行聚集索引,如ManufacturerID或CategoryID。在这些情况下,聚集索引(其他条件相等)将使相应的查询更加高效。

另一方面,指向此表的子表中的外键可能是聚集的好候选项(我反对具有IDENTITY属性的实际列,而不是它的相关列)。因此,在我的上面的示例中,很可能ManufacturerID是指向Manufacturer表的外键,该表中设置为IDENTITY。列不应聚集,但在Product中引用它的列可能会发挥良好优势。


1
大多数情况下,标识的存在意味着可以通过它们的标识访问记录,因此在标识字段上聚集主键似乎是一个不错的想法。 - C-F
3
@C-F - 这并不是聚集的理由。如果您基于该主键进行查询,那么其索引就会将您引向那里。而且可能更快,因为相对较窄的索引与聚集索引中行的完整宽度相比需要更少的IO才能通过。 - Chris Wuestefeld

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