【问题标题】:Oracle: Result set in insertion orderOracle:按插入顺序排列的结果集
【发布时间】:2021-08-27 13:01:15
【问题描述】:

在Oracle 数据库中,select 语句select * from tablename 不按插入顺序给出输出。在几篇文章中,我们发现Oracle数据库是基于Rowid来存储行信息的。

我们在基于 Java 的 Web 应用程序中使用 Oracle,并且需要在每个模块中按插入顺序显示数据。因此,对每个表应用 order by 子句是不可行的,并且会降低应用程序的性能。 有没有其他方法可以让select语句按插入顺序返回数据?

使用的 Oracle 版本是“Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production Version 19.3.0.0.0”

【问题讨论】:

  • SQL 数据是一个无序集,unless you have an order by clause可能有一些边缘情况(如 IOT),在没有它的情况下它也可以工作,但你不应该依赖它,而且无论如何这对你没有帮助。
  • 除了其他 cmets,我想解决您对 rowid 的引用。 rowid 与“插入顺序”无关。它只是行的“物理”地址——rowid 值包含定位行所需的信息:对象的数据对象编号;该行所在的数据文件中的数据块;该行在数据块中的位置(第一行为 0)。行所在的数据文件(第一个文件是 1)。文件号是相对于表空间的。 docs.oracle.com/cd/B19306_01/server.102/b14200/…

标签: java database oracle resultset oracle19c


【解决方案1】:

Oracle 是一个关系数据库。其中,行没有任何特定顺序,这意味着 select 语句在您多次运行时可能会以不同的顺序返回结果。通常它不会,但是 - 如果有很多插入/删除 - 迟早你会注意到这种行为。因此,以所需顺序返回行的唯一确定方法是使用 - ta-daaa! - order by 子句。

此外,您还必须维护自己的插入顺序。一种简单的方法是使用源为 sequence 的列。

【讨论】:

  • 序列不一定反映插入顺序 - 例如缓存在多个 RAC 节点上。时间戳更可靠?
  • 啊哈。好吧,我在多个 RAC 节点上的经验为零,@Alex,所以 - 谢谢你的评论,我希望 Hima 会考虑你所说的。
【解决方案2】:

我会先检查这里:previous-post

我建议不要依赖任何排序,除非您指定 order by

但是在查询中添加ORDER BY ROWNUM ASC; 之类的内容有什么不足之处?您可以修剪您的结果集(分页),甚至只对您想要“维护插入顺序”的实体进行修剪。

您是否使用任何东西进行实体管理? Hibernate 也有一些你可以使用的默认值。 - 发布一些代码示例,可以提供更多帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多