Oracle未定的订单

时间:2011-09-28 12:35:46

标签: oracle

我正在尝试为简单的选择查询添加分页,例如

select rownum rownum_,t.* from (select id,name from table) t
where rownum <=4

但是,当条件存在且条件不存在时,上述查询的行为会有所不同。但是在删除名称列时,行为是一致的。有谁能说出原因?

我理解rownum是在运行查询时确定的,我无法理解的是rownum&lt; = n的where条件会改变顺序

3 个答案:

答案 0 :(得分:6)

您必须了解rownum是伪列。

查询中的rownum列表示订单(第一个记录,第二个,第三个......)

然后是

返回的记录顺序
select id,name from table

不保证。在您的请求中,与第一条记录关联的rownum将始终为1,表示第一条记录每次都可能不同。

总之,当您需要特定订单时,请始终使用ORDER BY

答案 1 :(得分:5)

当您使用rownum进行限制时,该表可能会使用rownum <= 4上的索引。然后订单可能由索引定义。至少这是它在MySQL中的工作方式。如果您需要特定订购,请始终使用ORDER BY

答案 2 :(得分:2)

当您从查询中排除name列时,将从索引而不是从表中提取id的值,因此您将获得另一个订单。

我敢打赌的第二个问题是因为优化器使用并行来获取更多行。并行线程总是返回“乱序”,因为它们并行检索并行数据。 尝试使用提示/*+ NO_PARALLEL(table) */