【问题标题】:Is primary key always clustered?主键总是聚集的吗?
【发布时间】:2010-10-09 13:14:43
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server indexing primary-key


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      人们还可能会补充说,允许对主键进行集群通常是不好的。特别是,当主键由 IDENTITY 分配时,它没有任何内在意义,因此任何保持表相应排列的努力都是徒劳的。

      考虑一个表 Product,其 ProductID 为 INT IDENTITY PRIMARY KEY。如果这是集群的,那么以某种方式相关的产品很可能遍布整个磁盘。最好根据我们可能查询的内容(例如 ManufacturerID 或 CategoryID)进行聚类。在上述任何一种情况下,聚集索引都会(在其他条件相同的情况下)使相应的查询更加高效。

      另一方面,指向它的子表中的外键可能是聚类的一个很好的候选者(我反对的是实际上具有 IDENTITY 属性的列,而不是它的亲戚)。因此,在我上面的示例中,ManufacturerID 很可能是 Manufacturer 表的外键,在该表中它被设置为 IDENTITY。 那个列不应该被聚类,但是 Product 中引用它的列可能会这样做有很好的优势。

      【讨论】:

      • 身份的存在在大多数情况下意味着可以通过他们的身份访问记录,因此身份字段上的集群主键似乎是一个好主意。
      • @C-F - 这不是集群的理由。如果您基于该主键进行查询,则其索引将带您到达那里。并且可能更快,因为与聚集索引中的行的完整宽度相比,它几乎可以肯定需要更少的 IO 来通过相对狭窄的索引。
      猜你喜欢
      • 2011-08-21
      • 2010-12-17
      • 2020-11-06
      • 2011-01-25
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      相关资源
      最近更新 更多