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

标签 sql-server oracle select sql-order-by

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

最佳答案

不,这种行为是不可靠的。顺序由查询规划器决定构建结果集的方式确定。简单的查询,如 select * from foo_table可能会按照它们存储在磁盘上的顺序返回,这可能是主键顺序或它们创建的顺序,或其他一些随机顺序。更复杂的查询,例如 select * from foo where bar < 10相反,可以根据索引读取或表扫描的表顺序按不同列的顺序返回。更复杂的查询,使用多个 where条件,group by条款,union s,将按照规划者认为最有效的生成顺序进行。

两个相同查询之间的顺序甚至可能会发生变化,只是因为这些查询之间的数据发生了变化。 “where”子句可能满足一个查询中的索引扫描,但稍后的插入可能会降低该条件的选择性,并且规划器可以决定使用表扫描来执行后续查询。

<小时/>

要说得更清楚一点。 RDBMS 系统有责任尽可能高效地为您提供准确您所要求的信息。这种效率可以采取多种形式,包括最大限度地减少 IO(包括到磁盘以及通过网络向您发送数据)、最大限度地减少 CPU 并保持其工作集的大小较小(使用需要最少临时存储的方法)。

没有 ORDER BY子句中,您不会完全询问特定的顺序,因此 RDBMS 会根据查询的算法,以某种顺序为您提供这些行(可能)与查询的某些巧合方面相对应。 RDBMS 期望以最快的速度生成数据。

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

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

关于sql-server - 不带 Order By 子句的 SQL Select 语句的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10064532/

相关文章:

SQL 服务器 : slow query with 3 "OR" condition and order by Id

sql-server - Linq 转 Sql : SQL Default Value overridden

Oracle新手错误: ORA-00904 Invalid identifier when using "case when"

database - 在Oracle中,为什么最后创建LONG类型的列?

sql - SQLITE3子查询

sql - 如何将别名添加到 group by 子句

sql - 在数据库表中查找重复项,其中 2 列重复

sql-server - 使用 SSMS 或 VS 2012 生成过滤后的 INSERT 语句

sql-server - 根据同一列的先前值更新行。 (MSSQL2008)

sql - 查询以计算唯一关系的数量