sql - 如果我在没有 ORDER BY 的情况下对 SQL SELECT 查询进行分区,结果是否具有确定性?

标签 sql

我有 SQL SELECT 查询,它返回很多行,我必须将它分成几个分区。即,将最大结果设置为 10000 并迭代调用查询选择时间的行,增加第一个结果 (0, 10000, 20000)。所有查询都在同一个事务中完成,并且我的查询获取的数据在此过程中不会更改(尽管这些表中的其他数据可能会更改)。

可以只使用简单的选择:

select a from b where...

或者我必须使用 order by 和选择:
select a from b where ... order by c

为了确保我会得到所有的行?换句话说,是否保证没有 order by 的查询将始终以相同的顺序返回行?

向查询添加 order by 会显着降低查询的性能。

如果这很重要,我正在使用 Oracle。

编辑:不幸的是,我无法利用可滚动光标。

最佳答案

如果没有 order by 子句,绝对不能保证顺序,但是您的结果是否具有确定性(除了顺序之外)将取决于 where 子句。例如,如果您有一个唯一的 ID 列,并且您的 where 子句每次访问它时都包含不同的过滤器范围,那么您将获得无序的确定性结果,即:

select a from b where ID between 1 and 100
select a from b where ID between 101 and 200
select a from b where ID between 201 and 300

都将返回不同的结果集,但无法保证顺序。

关于sql - 如果我在没有 ORDER BY 的情况下对 SQL SELECT 查询进行分区,结果是否具有确定性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1707506/

相关文章:

php - 如何正确使用sql命令mid或substring?

mysql - 检索表的最后一行时出错

sql - 创建这些表: Could not create constraint or index: Datatype mismatch

sql - select * 是否影响存储过程性能?

mysql - 如果 value 为 0,为什么 SELECT ... WHERE id = a 返回结果

sql - 这两个 SQL 查询有什么区别?

MySQL - 三重嵌套选择的 where 子句

mysql - 操作数应包含 1 列错误

sql - 在 CONNECT-BY 查询中未获得完整的系列乘法(乘积)

mysql - 按半小时间隔分组