首页 > 解决方案 > 两种生成集群主键的方法有什么不同?

问题描述

我有一个表来制作集群主键。

  CREATE TABLE dbo.SampleTable
  (
   C1 INT NOT NULL,
   C2 INT NOT NULL )

第一种方法是使用聚集索引制作主键索引。

ALTER TABLE dbo.SampleTable ADD CONSTRAINT IDX_SampleTable PRIMARY KEY CLUSTERED (C1, C2)

第二种方式是CREATE CLUSTERED INDEXADD CONSTRAINT PRIMARY KEY NONCLUSTERED大约相同的列之后。

ALTER TABLE dbo.SampleTable ADD CONSTRAINT IDX_SampleTable PRIMARY KEY NONCLUSTERED (C1, C2)
CREATE CLUSTERED INDEX IDX_SampleTable2 ON dbo.SampleTable (C1 ,C2)    -- Can not create Same Name With above Constraint Name

以上两种方法在性能上有区别吗?
有没有不推荐使用的方法?

标签: sql-server

解决方案


是,有一点不同。通过指定CLUSTERED,您可以指示数据库以某种方式存储数据。基本上,它强制将后续索引存储在硬盘驱动器上的后续数据块上。

通过在第一条语句中创建聚集主键,表中的所有数据将始终具有唯一值,C1, C2并且数据始终存储在后续数据块中。

在第二个示例中,您不CLUSTERED通过主键强制执行此行为,而是通过单独的索引。尽管现在效果相同,但您可能会选择删除(或暂时禁用)索引,然后将不再保证以某种CLUSTERED方式存储数据。

底线:实际上,这两个语句现在是相同的,但将来可能会有所不同,因为该CLUSTERED属性没有集成在 PK 中,而是集成在单独的索引中。


推荐阅读