stored-procedures - 如何使用 Java 高效地准备包含大数据的映射表
问题描述
考虑我有两个表的场景,TABLE_A
并且TABLE_B
. 我想创建第三个表TABLE_C
,它只是一个包含两列的映射表,主键为TABLE_A
和TABLE_B
。TABLE_A 和 TABLE_B 分别包含 8000 万和 1.5 亿条记录。目前,我已经在 DB2(即我的 DB)中编写了一个存储过程,它将首先连接并从两个表中选择记录并使用游标进行迭代。在此迭代期间,我将插入第三个表并进行中间提交。
现在这个存储过程运行很长时间(大约 5 小时)来完成它,因为在 DB2 存储过程中不可能进行多行插入(这就是我所理解的)。是否可以通过一次获取记录并使用 JDBC Batch 从 Java 插入来将其移入 Java,以便插入将在多行中工作。但是如何在 Java 中保存这么大的结果集而不会出现 OutOfMemoryError
有人可以建议最好的方法。
更新:
DECLARE GLOBAL TEMPORARY TABLE SESSION.TABLE_DGTT AS (
select a.type_id as type_id,
a.a_id as a_id,
b.b_id as b_id
from TABLE_A a
inner join TABLE_B b on
AND b.process_date = i_order_date
AND b.tgt_date = CASE WHEN
a.tgt_date < i_order_date
THEN i_order_date ELSE a.tgt_date END
where not exists ( select 1 from TABLE_C c where
a.type_id = c.type_id
AND a.a_id = c.a_id)
AND a.process_date <= i_order_date
)
WITH NO DATA NOT LOGGED ON COMMIT PRESERVE ROWS ;
DECLARE C1 CURSOR FOR SELECT * FROM SESSION.TABLE_DGTT;
LOAD FROM C1 OF CURSOR INSERT INTO TABLE_C NONRECOVERABLE;
解决方案
使用基于 SELECT 语句的游标使用源表使用ADMIN_CMD 过程尝试 LOAD 命令是值得的。它适用于大数据负载。如果您不熟悉 LOAD 实用程序,
请使用选项。NONRECOVERABLE
最好阅读 LOAD 选项以了解副作用。
推荐阅读
- javascript - 具有 setTimeout 功能的点击事件。点击目标丢失
- google-sheets - INDIRECT 参数值在另一个选项卡中无效
- flutter - Flutter TextField:如何在右侧添加图标
- axapta - 如何从 ax2012 的自定义查找中获取选定的查找值
- flutter - ActionBar 中的 Fluttter 搜索栏,如 yelp 应用
- azure-synapse - 用于 Synapse 专用池的 OPENROWSET()?
- python - 不支持的索引分配目标
- javascript - 数组不呈现为子 Reactjs 的集合
- laravel - 我可以从客户端浏览器获得什么信息以及如何在 laravel 7.x 中获得这些信息
- java - 取消任务,如果在关机后调用,会阻止 awaitTermination 返回 true