JOOQ Insert into select with large number of records



我试图通过从不同的表中选择插入大量的记录。

在下面的例子中,BAR表有大约100万条记录,并试图将所有这些记录插入到FOO表中。有没有一种方法,我可以有效地做到这一点,没有加载器API或批量插入与JOOQ?

仅供参考,我试图避免在内存中加载所有记录的方法,所以我不使用期望JOOQRecords的加载器API。

dslContext
.insertInto(FOO)
.columns(FOO.A, FOO.B)
.select(
select(A, B)
.from(BAR))
.execute();

这不是严格意义上的jOOQ问题,因为在JDBC甚至存储过程中编写等效查询时也会遇到同样的问题。这种批量数据传输操作通常是使用SQL在表之间复制数据的最有效方法。可能有其他工具可以绕过SQL层(例如pg_dump),但对于SQL,这是最优的。

如果你没有足够的资源来一次运行所有的东西,你可以使用不同的技术将你的数据集分成几个块:

  • 通过传输单个日期范围的数据
  • 通过传输单个ID范围的数据
  • 通过使用键集分页

当按照上面提到的方式对数据进行分区时,也要检查是否可以减少事务大小,例如每次提交减少到1000行。这不是精确的科学,您必须根据经验为您的特定系统找到合适的块和事务大小。

使用所有这些方法,ACID不再得到保证,因此如果您的源数据在移动过程中被修改,您将不得不以某种方式检测它,并"修复它"。(例如,标记已移动的行)

或者,为系统增加更多内存。

相关内容

最新更新