为了账号安全,请及时绑定邮箱和手机立即绑定

不带Order By子句的SQL Select语句的顺序

/ 猿问

不带Order By子句的SQL Select语句的顺序

慕斯卡3215842 2019-11-15 10:53:51

据我所知,从关系数据库理论来看,select不带order by子句的语句应考虑为没有特定顺序。但是实际上,在SQL Server和Oracle中(我已经在这两个平台上进行了测试),如果我order by多次从不包含子句的表中查询,则总是以相同的顺序获得结果。可以依靠这种行为吗?有人可以帮忙解释一下吗?

查看完整描述

3 回答

?
45度呼吸

不,不能依靠这种行为。顺序由查询计划者决定构建结果集的方式确定。像这样的简单查询select * from foo_table很可能会按照它们在磁盘上存储的顺序返回,这些顺序可能是主键顺序,创建顺序或其他随机顺序。更复杂的查询(例如,select * from foo where bar < 10可以根据读取的索引或按表的顺序,以不同的列的顺序返回)来进行表扫描。计划者认为,生成where条件最复杂的查询,无论是乘数条件,group by子句,unions还是最有效的顺序。


甚至由于两个查询之间的数据已更改,顺序甚至可能在两个相同的查询之间更改。一个查询中的索引扫描可能满足“ where”子句的要求,但是以后的插入可能会使条件的选择性降低,并且计划者可以决定使用表扫描来执行后续查询。


为了更好地说明这一点。RDBMS系统有任务给你究竟你问什么,尽可能有效地。这种效率可以采取多种形式,包括最小化IO(同时将IO(同时发送到磁盘以及通过网络将数据发送给您)),最小化CPU并保持其工作集较小(使用需要最少临时存储的方法)。


如果没有ORDER BY子句,您将不会确切要求特定的顺序,因此RDBMS会根据RDBMS期望产生哪种算法的顺序,以与查询的某些偶然方面相对应的顺序给您提供那些行(也许)。数据最快。


如果您关心效率而不是顺序,请跳过该ORDER BY子句。如果您关心顺序而不是效率,请使用该ORDER BY子句。


由于您实际上关心两者的使用ORDER BY,然后仔细调整查询和数据库,以使其高效。


查看完整回答
反对 回复 2019-11-15
?
慕标5265247

不,您不能依赖每次都以相同的顺序返回结果。我发现在使用分页网格的网页上工作时发现了这一点。当我转到下一页,然后回到上一页时,上一页包含不同的记录!我完全被迷住了。

为了获得可预测的结果,您应该添加一个ORDER BY即使这样,如果那里的指定列中的值相同,您也可以获得不同的结果。ORDER BY为了获得可预见的结果,您可能不得不进入并非真正认为您需要的字段。


查看完整回答
反对 回复 2019-11-15
?
繁华开满天机

正确答案

这是为纠正旧答案而添加的新答案。我得到了汤姆·凯特(Tom Kyte)的回答,并将其发布在这里:


如果要对行进行排序,则必须使用订单。不,如果,和,或对接。期。http://tkyte.blogspot.ru/2005/08/order-in-court.html您需要在该物联网上订购。行按叶块排序,但叶块不按排序存储。快速全扫描=未排序的行。


https://twitter.com/oracleasktom/status/625318150590980097


https://twitter.com/oracleasktom/status/625316875338149888


错误的答案

(注意!仅出于历史考虑,将问题的原始答案放在此处。错误的答案。正确的答案位于上方)


正如汤姆·凯特(Tom Kyte)在前面提到的文章中写道:


您应该将堆组织表看作是一大堆无序的行集合。这些行将以看似随机的顺序出现,并且根据所使用的其他选项(并行查询,不同的优化器模式等),对于相同的查询,它们可能以不同的顺序出现。除非您在查询中有ORDER BY语句,否则永远不要指望查询中的行顺序!


但是请注意,他只谈论堆组织的表。但也有索引组织表。在这种情况下,您可以依赖选择的顺序,而不必ORDER BY使用主键隐式定义的顺序。对于Oracle来说确实如此。


对于默认创建的SQL Server群集索引(索引组织的表)。PostgreSQL存储信息也可能按索引对齐。更多信息可以在这里找到


更新: 我看到,我的答案被否决了。因此,我将尝试解释一下我的观点。在“ 索引组织表概述 ”部分中,有一个短语:


在索引组织表中,行存储在该表的主键上定义的索引中。当必须将相关数据段一起存储或必须以特定顺序物理存储数据时,索引组织表很有用。


http://docs.oracle.com/cd/E25054_01/server.1111/e25789/indexiot.htm#CBBJEBIH


由于索引的原因,所有数据都按特定顺序存储,我相信Pg也是一样。 http://www.postgresql.org/docs/9.2/static/sql-cluster.html


如果您不同意我的意见,请给我一个有关文档的链接。我很高兴知道有一些需要学习的东西。


查看完整回答
反对 回复 2019-11-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信