Jus*_*ner 43 sql-server oracle select sql-order-by
据我所知,从关系数据库理论来看,一个select没有order by条款的陈述应该被认为没有特别的顺序.但实际上在SQL Server和Oracle中(我在这两个平台上进行了测试),如果我从没有order by多次子句的表中查询,我总是以相同的顺序得到结果.这种行为是否可以依赖?有人可以帮忙解释一下吗?
Sin*_*ion 43
不,这种行为不能依赖.顺序由查询计划程序决定构建结果集的方式决定.类似的简单查询select * from foo_table可能按照它们存储在磁盘上的顺序返回,这可能是主键顺序或它们的创建顺序,或其他一些随机顺序.更复杂的查询,例如select * from foo where bar < 10可以基于索引读取或表顺序以不同列的顺序返回,用于表扫描.更复杂的查询,具有多重where条件,group by子句,unions,将以规划者决定的最有效生成的顺序排列.
由于这些查询之间的数据发生了变化,订单甚至可以在两个相同的查询之间进行更改.一个查询中的索引扫描可能满足"where"子句,但后来的插入可能使该条件的选择性降低,并且计划程序可以决定使用表扫描执行后续查询.
更精确一点.RDBMS系统有任务给你究竟你问什么,尽可能有效地.这种效率可以采取多种形式,包括最小化IO(磁盘以及通过网络向您发送数据),最小化CPU并保持其工作集的大小(使用需要最少临时存储的方法).
没有一个ORDER BY条款,你就没有问究竟对一个特定的顺序,所以RDBMS会给你一些为了那些行认为(也许)与查询的一些巧合方面,基于哪个算法RDBMS预计将产生对应数据最快.
如果您关心效率,而不关心订单,请跳过该ORDER BY条款.如果您关心订单但不关心效率,请使用该ORDER BY条款.
既然你真正关心BOTH使用ORDER BY,然后小心地调整你的查询和数据库,以便它是有效的.
不,您不能依赖每次以相同的顺序返回结果.我发现在使用分页网格的网页上工作时.当我转到下一页,然后回到上一页时,上一页包含不同的记录!我完全神秘化了.
那么,对于可预测的结果,你应该包括一个ORDER BY.即使这样,如果指定的列中存在相同的值,也可以得到不同的结果.您可能必须使用ORDER BY您认为不需要的字段,以获得可预测的结果.
| 归档时间: |
|
| 查看次数: |
33351 次 |
| 最近记录: |