暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 保持行顺序的操作

ASKTOM 2020-11-24
446

问题描述

嗨,汤姆,你工作的粉丝。

有一个问题: Oracle中是否有保留行顺序的任何操作?

例如,我可以期待
select * from (select tag from test order by tag)


会按排序顺序返回吗?

或者如果一个流水线表函数按一定顺序产生十几行,我可以用
"从表 (f()) 中选择 *"
以相同的顺序看他们?

游标会以相同的顺序从流水线函数中读取行吗?

基本上,寻找一般规则 “任何操作都会破坏行顺序” 的例外。

专家解答

正如医生所说:

Without an order_by_clause, no guarantee exists that the same query executed more than once will retrieve rows in the same order.

所以这不是行动destroy行顺序,更重要的是,如果没有顺序,你不能100% 确定行将按照你想要的顺序排列。

像这样的一个简单的子查询:

select * from (select tag from test order by tag)


在逻辑上与仅运行内部查询相同-外部查询中没有对数据的进一步处理,因此数据库没有理由更改顺序。

“什么都不做” 外部查询在现实世界中很少见。几乎可以肯定你有some外查询中的处理如过滤、分组等。对于简单的过滤 (只是一个where子句),我想不出有什么时候changed最初的排序。但就像我说的,不是guaranteed以保留原始顺序。

可以改变排序的常见反例是并行处理。在运行查询之前,有人可以执行:

alter session force parallel query;


并且以下所有查询都将并行运行。

虽然 (当前) 流水线表函数仅在特定情况下并行运行,但将来可能会发生变化。当ptf并行运行时,它们的行不再按照生成的顺序返回。

底线,如果你想成为100% certain您可以按照所需的顺序返回行,将order by添加到外部查询!

如果不必要,优化器将忽略它,只进行一种排序。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论