【问题标题】:primary key and clustered index主键和聚集索引
【发布时间】:2013-10-24 10:43:34
【问题描述】:
是否可以在SQL Server数据库中创建一个表,其中一列是主列,另一列有聚集索引,如下所示
create table tablename ( id int primary key , contact int clustered index)
数据的顺序是什么?
【问题讨论】:
标签:
sql
sql-server
primary-key
clustered-index
【解决方案1】:
可以创建一个表,其中一列是 PK,另一列有聚集索引,如下所示:
CREATE TABLE TableName
(ID INT NOT NULL PRIMARY KEY,
Contact INT NOT NULL UNIQUE CLUSTERED)
GO
SQL Server 将自动创建一个主键作为非聚集索引,因为在另一列上指定了聚集索引。
在任何 RDBMS 中都无法保证数据的顺序。
【解决方案2】:
在 SQL Server 中,您可以在任何可以被索引的列上创建聚集索引。它不必是与主键相同的列,聚集索引也不必是唯一的。
在 SQL Server 中确实不存在一种真正的“数据顺序”。聚集索引中页面的逻辑顺序被维护为一个双向链表,其中每个数据页面都指向下一页和上一页。当您创建聚集索引时,这些页面通常在某种程度上是磁盘上的“相邻”页面,但 SQL Server 不会尝试维护任何物理顺序,而是会拆分页面并根据需要在其他地方分配新页面.数据页中行的逻辑顺序由每个页上的插槽数组定义 - 行是按分配顺序存储的,而不是页内的集群键顺序,即使在聚集索引中也是如此。
但是,这些页面和行的逻辑顺序不一定与您在查询结果中看到的行顺序有任何关系。因此,对您的问题的正确答案是,当您在查询中指定 ORDER BY 子句时,顺序就是您想要的任何顺序。如果您不指定 ORDER BY,则该顺序未定义。