我有一个表来创建集群主键。
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
以上两种方法在性能上有区别吗?
有什么方法不建议您使用它吗?
答案 0 :(得分:1)
是的,有区别。通过指定CLUSTERED
,可以指示数据库以某种方式存储数据。基本上,它强制将后续索引存储在硬盘驱动器上的后续数据块上。
通过像在第一条语句中那样创建集群主键,表中的所有数据在C1, C2
中将始终具有唯一值,并且数据始终存储在后续数据块中。
在第二个示例中,您不是通过主键强制执行此CLUSTERED
行为,而是通过单独的索引强制执行。尽管现在效果相同,但是您可以选择删除(或暂时禁用)索引,然后将不再保证以CLUSTERED
的方式存储数据。
底线:实际上,这两个语句现在相同,但是将来可能会有所作为,因为CLUSTERED
属性未集成在PK中,而是集成在单独的索引中。
答案 1 :(得分:0)
这取决于您的数据:
聚集索引对数据行进行排序并将其存储在表或视图中 根据其关键值。这些是索引中包含的列 定义。每个表只能有一个聚集索引,因为 数据行本身只能以一种顺序存储。
因此,集群键会影响物理数据结构的格式。
答案 2 :(得分:0)
创建非聚集主键,然后在主键内的列上创建聚集索引不是一个好主意。实际上,您将在列上创建2个索引(在这种情况下为C1
和C2
),但是,极不可能使用非聚集索引。这是因为聚集索引很可能将成为RDBMS的首选,因为页面将按照聚集索引的顺序排列。另外,当使用非聚集索引时,数据引擎之后仍将需要引用聚集索引,以找出行的确切位置(在页面中)。
如果确实要在主键上创建聚簇索引,请将该键创建为聚簇主键。 这并不是说您的主键应该始终是群集的,但这是一个非常不同的主题。