结果我在COL1主键聚集索引SQL-Server的2005:为什么以不同的顺序返回与(NOLOCK)
为什么当我运行下面的语句是按不同的顺序返回的结果
select * from table
VS
select * from table with(nolock)
的结果也与TABLOCK不同
模式:
col1 int not null
col2 varchar (8000)
结果我在COL1主键聚集索引SQL-Server的2005:为什么以不同的顺序返回与(NOLOCK)
为什么当我运行下面的语句是按不同的顺序返回的结果
select * from table
VS
select * from table with(nolock)
的结果也与TABLOCK不同
模式:
col1 int not null
col2 varchar (8000)
没有任何ORDER BY
没有保证结果顺序。
您的问题现在被严重截断,但原始版本提到您在使用nolock
以及tablock
时看到了不同的结果顺序。
这两个锁定选项都允许SQL Server使用allocation order scan,而不是按逻辑顺序沿着聚集索引数据页(沿链接列表的指针)读取。
这不应被视为订单被保证为聚簇索引顺序,而不是advanced scanning mechanism,或者例如并行度都可以改变这一点。
+1有趣的文章! –
如果您未指定订单,则完全不确定。今天他们可能会有所不同,明天可能不会。
提供提示可能会无意中引导查询优化器降低效率。
除非您使用ORDER BY
,否则不会保证行的顺序。
如果必须按特定顺序包含行,则没有其他解决方案可按预定顺序返回行。
如果你离开了顺序由DBMS是免费的在它认为是最有效的
SQL服务器不作任何顺序保证任何顺序返回行,它会改变基础上的SQL Server如何优化查询。
要保证订单,您必须使用order by子句。
如果您没有'ORDER BY'子句,您为什么期望某个订单?实际上,您告诉SQL Server您并不关心订单,因此可以自由选择最理想的方式来返回数据(并且您需要假定这可以是*任意*顺序,并且可以在执行之间进行更改)。 –