Rownum 或 Fetch/offset 适合选择和处理数百万条记录

Posted

技术标签:

【中文标题】Rownum 或 Fetch/offset 适合选择和处理数百万条记录【英文标题】:Rownum or Fetch/offset is good to select and process million of records 【发布时间】:2018-09-16 13:25:38 【问题描述】:

我想从 oracle 读取数百万条记录并通过 Java 传输到另一个表。由于某种原因,我们正在使用 Java 进程,我们正在这样做。

我想问一下从表中选择记录的最佳方法,例如一次 1000 条记录。rownum 是好的还是 12c 中的 Fetch/Offset?

例如,如果表有 10000 条记录,我可以使用以下查询。

select *
from table
first 500 rows only  -- first time

select *
from table
offset 500 next 500 rows only

... 第二次(这次是 oracle 再次获取 1000 条记录并将 500 行发送到结果集 ..)

select *
from table
offset 1000 next 500 rows only

....这一次 oracle 是否再次获取 1500 条记录并发送 500 行到 resulset...

...等等

所以我不确定 Rownum 是一次选择 500 条记录还是偏移/获取方法的最佳方法......需要建议......

【问题讨论】:

We need tool support for keyset pagination 两张表在同一个数据库还是在不同的数据库? 为什么要使用 Java 来移动表格?我建议改为使用数据泵。 “由于某种原因我们正在使用 Java 进程” 是您想要以极其低效的方式执行此操作的原因吗? 我们现在不能使用任何工具,并且出于安全原因,我们正在使用自定义框架来传输数据..还有很多表格中的设计问题并重新创建表格进行一些按摩然后进行传输。 .so 使用 java 【参考方案1】:

您想从数据库 #1 中的表中提取数百万行,将它们拉到与 Java 应用程序的带宽相对较低的连接,以便您可以按摩它们,然后您想转身并推送这些相同的行UP 相同的连接,将它们放入数据库#2 - 你知道为什么这可能不是一个好的选择吗? :-)

更好 - 在数据库 #1 中构建一个临时表,然后在填充临时表后,使用 Oracle 到 Oracle 数据库连接将数据从数据库 #1 推送到数据库 #2。

类似:

Database #1
  CREATE TABLE TEMP_TABLE AS
    SELECT FIELD1,
           FIELD2,
           SUM(FIELD3)  -- or whatever
      FROM TABLE1
      WHERE WHATEVER = SOMETHING_ELSE
      GROUP BY FIELD1,
               FIELD2

  Run whatever PL/SQL procedures, etc, are needed to massage your data and make it 
  pretty.

Database #2
  CREATE TABLE PRETTY_BRAND_NEW_TABLE AS
    SELECT *
      FROM TEMP_TABLE@db1;

根据我的经验,这是您的最佳选择。 YMMV。

祝你好运。

【讨论】:

从oracle到mysql db。 我的问题是 oracle 在内部如何进行偏移/获取。 例如表有 10000 条记录。 offset 9000 fetch 500 表示 oracle 选择所有记录然后跳过 9000 或仅选择 9001 到 9500..

以上是关于Rownum 或 Fetch/offset 适合选择和处理数百万条记录的主要内容,如果未能解决你的问题,请参考以下文章

表未在单选查询中更新

单元测试引发:HsqlException 用户缺少权限或找不到对象:ROWNUM

Firebird rownum * 或 * linq 样式跳过并采取

mysql实现rownum方法

从工资中选择rownum,其中rownum = 3;

Oracle中rownum原理介绍