极度奇怪的难题,请大侠帮我看看

牵着你的手 2012-10-16 08:19:04
一个表USER,就一个列ID,里面有1,2,3三行,ID是主键就是按升序排的

DECLARE @i INT
SET ROWCOUNT 1
SELECT @i=id FROM dbo.Users
PRINT @i


这样输出的竟然是2

DECLARE @i INT
SET ROWCOUNT 1
SELECT @i=id FROM dbo.Users ORDER BY id asc
PRINT @i


这样输出就是1

然后不写SET ROWCOUNT

DECLARE @i INT
SELECT @i=id FROM dbo.Users ORDER BY id
PRINT @i


这样输出是3,就是把最后一个值赋予@i了

然后不写order

DECLARE @i INT
SELECT @i=id FROM dbo.Users
PRINT @i

输出变成1了。

谁能解释上述4种情况的原理,我找不出原因,非常感谢
...全文
2383 76 打赏 收藏 转发到动态 举报
写回复
用AI写文章
76 条回复
切换为时间正序
请发表友善的回复…
发表回复
sharpidd 2012-10-19
  • 打赏
  • 举报
回复
数据库默认的排序是物理排序,你是按2,1,3的方式输入,那么输出也就一样。
qq4004229 2012-10-19
  • 打赏
  • 举报
回复
根本不奇怪啊
auogsy 2012-10-18
  • 打赏
  • 举报
回复
fdsdfsfsd
牵着你的手 2012-10-17
  • 打赏
  • 举报
回复
OK稍微有点懂了
發糞塗牆 2012-10-17
  • 打赏
  • 举报
回复
还没睡…少量数据就算有索引,往往也会选择表扫描
DBA_磊仔 2012-10-17
  • 打赏
  • 举报
回复
对大量数据进行小范围查找的时候,索引的优势才会体现出来
牵着你的手 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 66 楼 的回复:]
那就单列建成唯一的非聚集索引,由于你有聚集索引存在,所以实际上聚集键列也会被系统自动的附加到这个索引中
[/Quote]

嗯,我就是这样建的,而且我测试了大数据比如select * from user where openid='asxasxasx'

这样,是走到那个非聚集索引的,就是起作用了是吧
ttpsan550 2012-10-17
  • 打赏
  • 举报
回复
在你不指定排序的情况下,查询的结果就有可能 根据 查询时 系统自动选用的‘索引’ 有关系,并不是说 有了聚集索引 ,查询结果的顺序就跟聚集索引有关 而是跟 查询时 走的 索引有关。 你可以 查询时 指定 索引然后看 结果的排序 就可以知道
牵着你的手 2012-10-17
  • 打赏
  • 举报
回复
非常感谢结贴
haitao 2012-10-17
  • 打赏
  • 举报
回复
order by、top n才是精确的做法,它是有保证的
否则,只能取决于数据库自己的不同实现而不同了,它是不保证的
DBA_磊仔 2012-10-16
  • 打赏
  • 举报
回复
那就单列建成唯一的非聚集索引,由于你有聚集索引存在,所以实际上聚集键列也会被系统自动的附加到这个索引中
發糞塗牆 2012-10-16
  • 打赏
  • 举报
回复
因为查询的时候往往都是多列的,如果这些列上没有索引,会引起书签查找(这个开销通常比较大),这个你可能展示理解不了。但是不是每个查询的列都要建索引。索引这东西,可以写一本书,还是好好学习一下,我也要学习,没有磊仔理解得深入夜深了,没事就结贴吧。睡个安稳觉
牵着你的手 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 63 楼 的回复:]
是i不对,我只是强制了它的行为而已,但是现实工作中很多非聚集索引,很少会单列做索引。
[/Quote]
哦,最后一个问题,为啥非聚集索引很少会单列做索引呢,我这个OPENID要求快速定位,且是唯一的,是否应该在这个列上做个非聚集索引呢?
發糞塗牆 2012-10-16
  • 打赏
  • 举报
回复
是i不对,我只是强制了它的行为而已,但是现实工作中很多非聚集索引,很少会单列做索引。
牵着你的手 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 的回复:]
你先看看执行计划里面用到的是什么,聚集索引还会索引
[/Quote]

嗯我目前是懂了,那个是2的走的是非聚集索引,我在想,DB哥把两个字段合在一起创建了一个索引,这样是不对的吧,我那个非聚集索引要查询的,您合在一起就用不了了
發糞塗牆 2012-10-16
  • 打赏
  • 举报
回复
主键和聚集索引是两回事,只是SQLServer默认这种行为而已。我这是强制按照第一列来排序,如果第一列相同,按第二列来排序
DBA_磊仔 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 的回复:]
引用 54 楼 的回复:
跟用不用语句创建无关,应该和磊仔说的那样,聚集索引没用到,反而用了非聚集索引。所以按非聚集索引来排序


您刚才这样CREATE CLUSTERED INDEX Clustered_user ON users (id,openid ASC )
就不是2了吗,就是1了吗,那怎么解释呢,这样就用到聚集索引了吗,您这样不会是多列主键吧,根本不是非聚集索引
[/Quote]因为他删掉了其他索引,这样就只有聚集索引了,一定会用到这个聚集索引
DBA_磊仔 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 的回复:]

您的意思是如果一个表里有聚集索引和非聚集索引,查的时候最好加上ORDER BY是吗?
[/Quote]不是查询要加order by 加order by 需要额外的开销,如果你不需要数据排序,最好不要加,
因为你希望数据按你想的方式排序,所以就要加
牵着你的手 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 的回复:]
跟用不用语句创建无关,应该和磊仔说的那样,聚集索引没用到,反而用了非聚集索引。所以按非聚集索引来排序
[/Quote]

您刚才这样CREATE CLUSTERED INDEX Clustered_user ON users (id,openid ASC )
就不是2了吗,就是1了吗,那怎么解释呢,这样就用到聚集索引了吗,您这样不会是多列主键吧,根本不是非聚集索引
DBA_磊仔 2012-10-16
  • 打赏
  • 举报
回复
你先看看执行计划里面用到的是什么,聚集索引还会索引
加载更多回复(56)

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧