【问题标题】:Are the results deterministic, if I partition SQL SELECT query without ORDER BY?如果我在没有 ORDER BY 的情况下对 SQL SELECT 查询进行分区,结果是否具有确定性?
【发布时间】:2016-02-13 05:44:43
【问题描述】:

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

只使用普通选择可以吗:

select a from b where...

或者我是否必须在 select 中使用 order by:

select a from b where ... order by c

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

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

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

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

【问题讨论】:

  • 始终如果您希望数据集排序,请使用 order by。如果存在性能问题,那就是另一个问题(检查索引、检查执行计划等等)。
  • 为了性能:使用索引列作为 order by 子句或将索引应用于要在 order by 子句中使用的列

标签: sql


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

不,如果没有 order by,则不能保证查询总是以相同的顺序返回行。

【讨论】:

  • 即使有订单也不能保证!可能有联系。
【解决方案3】:

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

错误的 SQL Server 示例,但适用相同的规则。即使使用内部查询也不能保证顺序

SELECT
    *
FROM
    (
    SELECT
        *
    FROM
        Mytable
    ORDER BY SomeCol
    ) foo

【讨论】:

  • 是否存在联系也无法确定,即使是ORDER BY。所以你的第一句话是不正确的。
【解决方案4】:

使用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 是您想从哪个位置开始,第二个变量是您想看到多少个结果。
这是一个很好的分页技巧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多