【问题标题】:How to handle 100 million records inserts into a db2 table using java如何使用 java 处理 1 亿条记录插入到 db2 表中
【发布时间】:2016-06-27 00:07:40
【问题描述】:

作为我们应用程序开发的一部分,我们需要读取 1 亿条记录,对其进行处理,然后将它们插入到 DB2 表中。

我们在主键上使用索引,但不确定插入过程是否需要很长时间,比如几个小时。

我们正在对目标表的字段名称进行哈希处理,以便在不同节点之间分配数据。所以如果我们想到分区表/字段数据的散列,我猜它对插入没有帮助

我想知道使用 Java 有效地处理向 DB2 数据库表中插入 1 亿条记录的可用选项。我们正在使用弹簧批处理(一次批处理 9k 条记录)。

提前致谢。

【问题讨论】:

  • 这个问题可能更适合Database Administrators。我正在标记它以进行迁移。
  • 通常使用可用于特定 RDBMS 的工具之一将所有数据加载到 RDBMS DB 中效率更高(我猜它是 DB2 的加载实用程序),然后在数据库中处理您的数据。我不知道在您的情况下是否可行,但在我的工作历史中,与应用程序逐行方法相比,它始终是可能的并且总是快得多
  • 一个重要提示:当插入这样的大量数据时,在加载所有数据之前不要创建索引(并且不要定义主键,它是通过索引实现的)。在许多数据库上,最好将任何触发器和规则的创建也延迟到插入完成之后。
  • 除了@MaxU 所说的,我已经创建了卸载/加载格式的DB2 行并将这些行写入QSAM(平面)文件。作为最后一步,我删除了所有索引,使用加载实用程序加载行,然后重建所有索引。没关系,它更快。重要的是,在我们准备好加载之前,我们不必锁定表。
  • @techi 抱歉,我的意思是您的编写器进程是否使用 JDBC addBatch() 和 executeBatch() 调用。对于并行化,您是否有多个单独的线程写入数据库(即对输入进行分区并有多个线程处理/写入)?另外,您的吞吐量要求是多少?这需要运行多快?

标签: java sql db2 spring-batch


【解决方案1】:

选项-1(Java): 我认为您可以尝试研究对源表进行分区。这将有很大帮助,但它会带来一些牺牲,例如您将无法更新您选择分区的列。此外,您必须选择正确的列进行分区。您不想最终得到 1000 个分区。相反,您希望对可能没有任何关系的隔离数据进行分区。例如,如果您的源中有一个列 CITY,您可以尝试在 CITY 上进行分区。因此,如果您拥有 50 个城市的数据,那么您最终可能会得到 50 个分区。它有很大帮助。您尝试按日期范围或一年中的季度进行分区。 这些确实对我选择数据有很大帮助,您还可以查看每个分区上的多线程。

选项 2(存储过程 (SP)): 您可以尝试在数据库中使用存储过程 (PL/SQL),这样您就不必担心 Java。 SP 的速度甚至比 Java 的批处理快 100 倍。但即使您使用 SP,我仍然建议对源表进行分区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2011-02-20
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多