Java 大型数据库插入

Posted

技术标签:

【中文标题】Java 大型数据库插入【英文标题】:Java Large database inserts 【发布时间】:2010-02-19 19:37:19 【问题描述】:

我有一个数据库,我需要在其中插入一批数据(一次大约 50 万条记录)。我正在使用 derby 进行测试,发现这么多记录的插入时间约为 10-15 分钟(我正在使用 Java 进行批量插入)。

这个时间是否看起来很慢(在普通笔记本电脑上工作)?有没有加快速度的方法?

谢谢,

杰夫

【问题讨论】:

【参考方案1】:

这个时间似乎完全合理,并且与我观察到的时间一致。如果您希望它运行得更快,您需要使用批量插入选项并禁用安全功能:

使用 PreparedStatements 和 5,000 到 10,000 条记录的批次,除非它必须是一个事务 在 DBMS 中使用批量加载选项 暂时禁用插入的完整性检查 暂时禁用索引或删除索引并在插入后重新创建它们 禁用事务日志记录,然后重新启用。

编辑:数据库事务受到磁盘 I/O 的限制,在笔记本电脑和大多数硬盘上,重要的数字是磁盘的寻道时间。

笔记本电脑的磁盘速度往往很慢,为 5400 rpm。在这个速度下,寻道时间约为 5 ms。如果我们假设每条记录一次搜索(在大多数情况下高估),则插入所有行需要 40 分钟(500000 * 5 毫秒)。现在,缓存机制和排序机制的使用在一定程度上减少了这种情况,但您可以看到问题出在哪里。

我(当然)将问题过于简单化了,但是您可以看到我要解决的问题;期望数据库以与顺序批量 I/O 相同的速度执行是不合理的。您必须对记录应用某种索引,这需要时间。

【讨论】:

以上是关于Java 大型数据库插入的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL*Plus 生成和插入大型 CLOB (1 MB)

带有大型数据集的 SQL 插入

用于对大型数组进行高效插入和删除的数据结构

如何在 db2 中生成和插入大型数据集?

检测到 Sqoop 套接字超时:从大型机读取数据并插入 Hive 时读取超时

将 280,000 条记录的大型数据表的每个变体插入另一个表的更快方法是啥?