这两种生成集群主键的方法有何不同?

时间:2019-05-23 08:27:18

标签: sql-server

我有一个表来创建集群主键。

  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 INDEX之后ADD 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

以上两种方法在性能上有区别吗?
有什么方法不建议您使用它吗?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

这取决于您的数据:

https://docs.microsoft.com/en-gb/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-2017

  

聚集索引对数据行进行排序并将其存储在表或视图中   根据其关键值。这些是索引中包含的列   定义。每个表只能有一个聚集索引,因为   数据行本身只能以一种顺序存储。

因此,集群键会影响物理数据结构的格式。

答案 2 :(得分:0)

创建非聚集主键,然后在主键内的列上创建聚集索引不是一个好主意。实际上,您将在列上创建2个索引(在这种情况下为C1C2),但是,极不可能使用非聚集索引。这是因为聚集索引很可能将成为RDBMS的首选,因为页面将按照聚集索引的顺序排列。另外,当使用非聚集索引时,数据引擎之后仍将需要引用聚集索引,以找出行的确切位置(在页面中)。

如果确实要在主键上创建聚簇索引,请将该键创建为聚簇主键。 这并不是说您的主键应该始终是群集的,但这是一个非常不同的主题。