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

时间:2009-11-10 12:10:44

标签: sql

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

只使用普通选择是否可以:

select a from b where...

或者我必须使用select:

来使用order
select a from b where ... order by c

为了确保我能获得所有行?换句话说,是否保证没有order by的查询总是以相同的顺序返回行?

向查询添加顺序会显着降低查询的性能。

如果重要的话,我正在使用Oracle。

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

4 个答案:

答案 0 :(得分:5)

如果没有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

会返回不同的结果集,但订单不会得到任何保证。

答案 1 :(得分:3)

不,没有订单,不能保证查询总是以相同的顺序返回行。

答案 2 :(得分:2)

除非您在最外层查询上有订单,否则无法保证。

错误的SQL Server示例,但适用相同的规则。即使使用内部查询

,也无法保证订单
SELECT
    *
FROM
    (
    SELECT
        *
    FROM
        Mytable
    ORDER BY SomeCol
    ) foo

答案 3 :(得分:1)

使用Limit

所以你会这样做:

  

SELECT * FROM table ORDER BY id LIMIT 0,100
  SELECT * FROM table ORDER BY id LIMIT 101,100
  SELECT * FROM table ORDER BY id LIMIT 201,100

LIMIT将从您想要开始的位置开始,第二个变量将是您想要查看的结果数量。
这是一个很好的噱头。