问题描述
嗨,汤姆,你工作的粉丝。
有一个问题: Oracle中是否有保留行顺序的任何操作?
例如,我可以期待
会按排序顺序返回吗?
或者如果一个流水线表函数按一定顺序产生十几行,我可以用
"从表 (f()) 中选择 *"
以相同的顺序看他们?
游标会以相同的顺序从流水线函数中读取行吗?
基本上,寻找一般规则 “任何操作都会破坏行顺序” 的例外。
有一个问题: 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% 确定行将按照你想要的顺序排列。
像这样的一个简单的子查询:
在逻辑上与仅运行内部查询相同-外部查询中没有对数据的进一步处理,因此数据库没有理由更改顺序。
“什么都不做” 外部查询在现实世界中很少见。几乎可以肯定你有some外查询中的处理如过滤、分组等。对于简单的过滤 (只是一个where子句),我想不出有什么时候changed最初的排序。但就像我说的,不是guaranteed以保留原始顺序。
可以改变排序的常见反例是并行处理。在运行查询之前,有人可以执行:
并且以下所有查询都将并行运行。
虽然 (当前) 流水线表函数仅在特定情况下并行运行,但将来可能会发生变化。当ptf并行运行时,它们的行不再按照生成的顺序返回。
底线,如果你想成为100% certain您可以按照所需的顺序返回行,将order by添加到外部查询!
如果不必要,优化器将忽略它,只进行一种排序。
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




