meh*_*hah 3 sql-server primary-key clustered-index nonclustered-index table
我在 name 列上创建了一个带有主键的表,表的排序基于 name 列
create table TestPrimaryKey (Name varchar(20) primary key,id int identity)
insert into TestPrimaryKey (SomeText) values ('john')
insert into TestPrimaryKey (SomeText) values ('ryan')
insert into TestPrimaryKey (SomeText) values ('jennifer')
insert into TestPrimaryKey (SomeText) values ('martha')
insert into TestPrimaryKey (SomeText) values ('luke')
insert into TestPrimaryKey (SomeText) values ('alex')
insert into TestPrimaryKey (SomeText) values ('wayne')
Run Code Online (Sandbox Code Playgroud)
现在我将主键上的聚集索引更改为非聚集索引,排序仍然基于名称列
begin tran
alter table dbo.TestPrimaryKey drop constraint PK__TestPrim__BC2905030401D947
alter table dbo.TestPrimaryKey add constraint PK__TestPrim__BC2905030401D947 primary key nonclustered (SomeText)
commit tran
Run Code Online (Sandbox Code Playgroud)
现在我正在另一个 (id) 列上创建一个唯一的聚集索引,但顺序仍然相同
create unique clustered index CI__TestPrim__BC29050354394FAA on TestPrimaryKey(id)
Run Code Online (Sandbox Code Playgroud)
现在我从表中删除聚集索引
drop index CI__TestPrim__BC29050354394FAA on TestPrimaryKey
Run Code Online (Sandbox Code Playgroud)
但是现在排序从“name”列更改为“id”列。我需要知道为什么会发生这种情况,以及如果表具有非聚集主键和聚集索引列,排序将基于主键列、聚集索引列或两者。
Dav*_*ett 15
除非您使用ORDER BY子句明确说明所需的顺序,否则您无法保证数据响应查询的顺序。如果没有ORDER BY子句,引擎可以自由地以当时它认为最方便的任何顺序向您呈现数据,这可能意味着您之前运行的同一查询的顺序不同。
如果存在聚集索引,则数据页与行按此顺序存储,但这并不能保证它们将按此顺序进行处理(如果没有连接或排序子句,则很可能没有连接或排序子句,但没有将输出的订单行的显式排序请求正式为“未定义”)。
在没有聚集索引的情况下,行以无序方式存储在数据页中(这称为“堆表”)。这可能最初与插入数据的顺序相同,但是一旦删除和更新开始发生,这绝对不是真的。
如果您想阅读一些理论,请查阅关系数据库所基于的“集合理论”。数学集本质上是无序的,这意味着默认情况下,关系数据库中的任何内容都应视为无序的。
关于非集群主键:这些根本不影响存储的行数据的顺序。它们对您的数据模型具有额外的意义,但在物理上不会做任何具有“唯一”属性集的非聚集索引会做的事情。类似地,聚簇主键在内部只是一个聚簇唯一索引,对您的数据模型具有额外的意义。
tl;dr:如果数据需要以特定方式排序,则必须直接在ORDER BY子句中指定该顺序。
| 归档时间: |
|
| 查看次数: |
1937 次 |
| 最近记录: |