【问题标题】:Store sorted by primary key data in Oracle DBOracle DB中按主键数据排序的存储
【发布时间】:2016-10-14 14:30:00
【问题描述】:

应用程序在测试服务器和生产服务器上运行,两者都与 Oracle 11g DB 集成。

我注意到在将数据存储在表中时,测试服务器上有一些排序:

SELECT * FROM table1:
    |ID-PK| FK1 |name|
    | 100 | 50  | a1 |
    | 101 | 50  | a2 |
    | 102 | 50  | a3 |

当我在另一个数据库服务器上对同一个表执行相同的查询时,我得到了一些无序的结果:

SELECT * FROM table1:
    |ID-PK| FK1 |name|
    | 102 | 50  | a3 |
    | 100 | 50  | a1 |
    | 101 | 50  | a2 |

如何强制第二个数据库存储数据按 PK 排序?

插入的实体是由Java web-application(使用JPA)创建的,PK是按递增顺序生成的,所以后面创建的实体应该显示在表的末尾。

【问题讨论】:

  • 使用order by - 这是only(真的:only)在选择时获得定义顺序的方式。没有其他选择
  • 您已经两次得到相同(正确)的答案,一次是在答案中,另一次是在评论中。您应该问的下一个问题是,“那为什么我要在第一个查询中按顺序获取行?我什么时候可以依赖它?”第一个问题的答案是“没关系”,第二个问题的答案是“从不”。只是把第一个查询结果当作侥幸;明天你甚至可能不会得到同样的行为。尝试添加 PK=95 的行(如果尚未使用),看看会发生什么!

标签: sql oracle oracle11g


【解决方案1】:

表中的数据不是按顺序存储的。如果不向您的查询添加ORDER BY,数据库将以最快的方式从表中返回行,它可以从磁盘/存储中读取它们,这并不能保证它们按排序顺序返回。

第一个服务器上的查询返回的数据可能已经在缓冲区缓存中,由先前运行的查询返回,该查询具有ORDER BY

当您发出缺少ORDER BY 的查询时,引擎决定从缓冲区缓存中提取数据而不是返回磁盘,这就是它们“按顺序”显示的原因。

【讨论】:

  • 表中的数据总是以一些的顺序存储的(也许是按ROWID?)。第一个查询可能仅按它们插入表中的顺序显示行,如果表从未有任何删除或更新,并且 PK 是否按递增顺序排列。只是永远不应该依赖这种物理顺序,绝对不能保证任何查询都会以这种方式显示行,甚至磁盘上的物理顺序也可能随着时间而改变。但 行有可能在查询 1 中直接从磁盘“排序”出来。
  • @mathguy 没错,但是虚拟化存储呢?无论如何,正如您还指出的那样,最重要的是,如果不使用ORDER BY,则不能保证“按顺序”返回数据。
  • 当然。我对评论的唯一观点是,“好的,但为什么查询 1 实际显示已排序的行?”人们看到这种行为会产生错误的印象——尤其是在单用户环境(如我的环境)和没有事务的表上,行将始终按照插入的顺序排列。现在我可能开始有了想法。正如我们在这里所说的那样,这些想法是完全错误的。
【解决方案2】:

如果您想在直接查询表时获得数据顺序,可以使用 IOT(索引组织表),但这可能会对性能产生影响,具体取决于表的宽度。堆表的干净解决方案是使用 ORDER BY 子句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多