2011-09-07 30 views
0

结果我在COL1主键聚集索引SQL-Server的2005:为什么以不同的顺序返回与(NOLOCK)

为什么当我运行下面的语句是按不同的顺序返回的结果

select * from table 

VS

select * from table with(nolock) 

的结果也与TABLOCK不同

模式:

col1 int not null 
col2 varchar (8000) 
+1

如果您没有'ORDER BY'子句,您为什么期望某个订单?实际上,您告诉SQL Server您并不关心订单,因此可以自由选择最理想的方式来返回数据(并且您需要假定这可以是*任意*顺序,并且可以在执行之间进行更改)。 –

回答

4

没有任何ORDER BY没有保证结果顺序。

您的问题现在被严重截断,但原始版本提到您在使用nolock以及tablock时看到了不同的结果顺序。

这两个锁定选项都允许SQL Server使用allocation order scan,而不是按逻辑顺序沿着聚集索引数据页(沿链接列表的指针)读取。

这不应被视为订单被保证为聚簇索引顺序,而不是advanced scanning mechanism,或者例如并行度都可以改变这一点。

+0

+1有趣的文章! –

0

如果您未指定订单,则完全不确定。今天他们可能会有所不同,明天可能不会。

提供提示可能会无意中引导查询优化器降低效率。

3

除非您使用ORDER BY,否则不会保证行的顺序。

如果必须按特定顺序包含行,则没有其他解决方案可按预定顺序返回行。

如果你离开了顺序由DBMS是免费的在它认为是最有效的

1

SQL服务器不作任何顺序保证任何顺序返回行,它会改变基础上的SQL Server如何优化查询。

要保证订单,您必须使用order by子句。

相关问题