没有order by语句时结果集是按什么排序的

我们知道在sql中order by子句用来控制返回的结果集中记录的顺序。那么当我们的sql没有提供order by子句时,返回的记录是按什么排序的呢。簇索引?主键?这是我之前以为的答案,直到我认真地google了一下这个问题。

答案是,没有顺序,每次的结果不一定。

stackoverflow上有一个哥们回答了这个问题

https://stackoverflow.com/questions/20050341/when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record

为了增加自己答案的说服力,他引用了一篇sql server 核心组架构师Conor Cunningham的帖子。这篇帖子大意是这样的,大家认为sql语句返回的记录集是有顺序的,通常的原因是,对于相同的sql,数据库经常使用同一个查询计划进行查询,所以每次返回的结果看起来是相同的。但这并不是固定不变的,我们并不能预见数据库采用怎样的查询计划。Conor Cunningham在自己的机器上做了一个实验。一张表只有一个簇索引。向表中插入20k数据,执行一个select语句,数据库执行了在簇索引上的扫描。向表中插入另外20k数据,再次执行相同的sql, 这一次,数据库执行了一个并行的查询计划,多个thread并发做簇索引扫描,并且把满足条件的记录合并起来,这导致了返回的数据集顺序不定。通过这个简单的例子我们确定了,没有order by子句,就不要期望结果集有顺序。

对详情感兴趣的同学可以去阅读Conor Cunningham的原贴

https://blogs.msdn.microsoft.com/conor_cunningham_msft/2008/08/27/no-seatbelt-expecting-order-without-order-by/

猜你喜欢

转载自smartgear.iteye.com/blog/2302796
今日推荐