我有一个非常简单的表,用于存储人们的头衔(“先生”、“女士”等)。这是我正在做的事情的简要版本(在本示例中使用临时表,但结果是相同的):
create table #titles (
t_id tinyint not null identity(1, 1),
title varchar(20) not null,
constraint pk_titles primary key clustered (t_id),
constraint ux_titles unique nonclustered (title)
)
go
insert #titles values ('Mr')
insert #titles values ('Mrs')
insert #titles values ('Miss')
select * from #titles
drop table #titles
请注意,表的主键是聚集的(为了示例而明确),并且标题列存在非聚集唯一性约束。
这是选择操作的结果:
t_id title
---- --------------------
3 Miss
1 Mr
2 Mrs
从执行计划来看,SQL 使用非聚集索引而不是聚集主键。我猜这解释了为什么结果按这个顺序返回,但我不知道它为什么这样做。
有任何想法吗?更重要的是,有什么办法可以阻止这种行为吗?我希望这些行按照插入的顺序返回。
Thanks!
如果你想要顺序,你需要指定一个明确的ORDER BY
- 其他任何事情都可以not产生一个订单(它的“订单”是随机的并且可能会改变)。 SQL Server 中没有隐含的排序 - 没有任何隐含的排序。如果您需要订购 - 请这样说ORDER BY
.
SQL Server 可能使用非聚集索引(如果可以的话 - 如果该索引包含查询要求的所有列),因为它较小 - 通常只有索引列和聚集键(同样:一个或多个)列)。另一方面,聚集索引是整个数据(在叶级别),因此可能需要读取更多数据才能得到答案(当然不是在这个过于简化的示例中 - 但在现实世界)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)