我试图通过从不同的表中选择插入大量的记录。
在下面的例子中,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不再得到保证,因此如果您的源数据在移动过程中被修改,您将不得不以某种方式检测它,并"修复它"。(例如,标记已移动的行)
或者,为系统增加更多内存。