首页 > 解决方案 > 如何使用 Java 高效地准备包含大数据的映射表

问题描述

考虑我有两个表的场景,TABLE_A并且TABLE_B. 我想创建第三个表TABLE_C,它只是一个包含两列的映射表,主键为TABLE_ATABLE_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;

标签: stored-proceduresjdbcdb2

解决方案


使用基于 SELECT 语句的游标使用源表使用ADMIN_CMD 过程尝试 LOAD 命令是值得的。它适用于大数据负载。如果您不熟悉 LOAD 实用程序,
请使用选项。NONRECOVERABLE最好阅读 LOAD 选项以了解副作用。


推荐阅读