我在col1
中有一个主键聚簇索引为什么当我运行以下语句时,结果会以不同的顺序返回
select * from table
VS
select * from table with(nolock)
tablock的结果也不同
模式:
col1 int not null
col2 varchar (8000)
答案 0 :(得分:4)
没有任何ORDER BY
没有保证结果的顺序。
您的问题现在被严重截断,但原始版本提到您在使用nolock
以及tablock
时看到了不同的结果顺序。
这两个锁定选项都允许SQL Server使用allocation order scan而不是按逻辑顺序读取聚簇索引数据页(沿着链接列表的指针)。
这不应被视为保证订单处于聚簇索引顺序而不是advanced scanning mechanism,或者例如并行性都可以改变它。
答案 1 :(得分:3)
除非您使用ORDER BY
。
如果必须按特定顺序排列,则没有其他解决方案会以可预测的顺序返回行。
如果您通过DBMS省略订单,可以按其认为最有效的任何顺序自由返回行
答案 2 :(得分:1)
Sql Server不保证订购,它会根据Sql Server如何优化查询而改变。
为了保证订单,您必须使用order by子句。
答案 3 :(得分:0)
如果您没有指定订单,那么这完全是不确定的。今天他们可能会有所不同,明天可能不会。
提供提示可能会无意中将查询优化器引导到更有效的路径。