SQL-Server-2005:为什么结果以不同的顺序返回(nolock)

时间:2011-09-07 17:38:38

标签: sql sql-server-2005

我在col1

中有一个主键聚簇索引

为什么当我运行以下语句时,结果会以不同的顺序返回

select * from table

VS

select * from table with(nolock)

tablock的结果也不同

模式:

col1 int not null
col2 varchar (8000)

4 个答案:

答案 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)

如果您没有指定订单,那么这完全是不确定的。今天他们可能会有所不同,明天可能不会。

提供提示可能会无意中将查询优化器引导到更有效的路径。