【问题标题】:Apache Derby INSERTS are slowApache Derby INSERTS 很慢
【发布时间】:2012-02-03 11:05:16
【问题描述】:

我正在使用 Apache Derby 来存储数以千万计的大量行。每次我启动批量插入时,我都会向表中插入多达 200 万行。 该表有一个 UUID 作为其主键,并有一个与另一个表中的 UUID 的单一约束。 插入需要几个小时!为什么 ? 我已经在所有表上创建了索引 - 但我已经删除了它,因为我相信 Derby 会自动为每个带有主键的表创建一个索引。 我正在使用带有准备好的语句的批量更新,如下所示(以下面非常简单的形式)

final PreparedStatement addStatement = connection.prepareStatement(...)
int entryCount = 0;
  for (final T entry : entries) {
    addStatement.addBatch();
    entryCount++;
    if (entryCount % 1000 == 0) {
    addStatement.executeBatch();
    addStatement.clearBatch();
    entryCount = 0;
    }
 addStatement.close();

这是结果

05/01/12 12:42:48 Creating 2051469 HE Peaks in DB Table APP.ST_HE_PEAK_TABLE
05/01/12 12:44:18 Progress: Written (10%) 205146/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE
05/01/12 12:46:51 Progress: Written (20%) 410292/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE
05/01/12 12:50:46 Progress: Written (30%) 615438/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 05/01/12 12:56:46 Progress: Written (40%) 820584/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE
05/01/12 13:04:29 Progress: Written (50%) 1025730/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE
05/01/12 13:13:19 Progress: Written (60%) 1230876/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE
05/01/12 13:22:54 Progress: Written (70%) 1436022/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE
05/01/12 13:34:53 Progress: Written (80%) 1641168/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE
05/01/12 13:47:02 Progress: Written (90%) 1846314/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE
05/01/12 13:58:09 Completed: Written (100%) 2051469/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE - Time Taken:01:15:21

随着我插入越来越多的行,这个过程变得越来越慢(可能是因为 INDEX)。我目前拥有的 DB 模型很好地满足了我的目的,我不愿意改变它。 难道我做错了什么 ? ……还是期望太高? 有什么办法可以提高 INSERT 速度?


编辑

我已经使用自动提交和其他方法调整了数据库。我发现当 INSERT 数百万条记录时 - 我的应用程序确实花费了不合理的时间。对这些数据进行 SELECT 的速度当然非常快。

【问题讨论】:

  • 您知道您可以使用 Derby 将数据持久保存在磁盘上,并从最后一个记录 ID 加载远程数据吗? (对不起,显而易见。)

标签: java database derby


【解决方案1】:

您是否尝试过关闭自动提交模式?来自http://db.apache.org/derby/docs/dev/tuning/tuningderby.pdf

在自动提交模式下插入可能会非常缓慢,因为每次提交都涉及一个 为每个 INSERT 语句更新磁盘上的日志。提交将不会返回,直到 执行物理磁盘写入。为了加快速度:

  • 在自动提交假模式下运行,在一个事务中执行多个插入,并且 然后明确发出提交。
  • 如果您的应用程序允许初始加载到表中,您可以使用导入 向表中插入数据的过程。 Derby 不会记录单个插入 使用这些接口加载到一个空表中。参见德比参考 手册和 Derby 服务器和管理指南以获取有关 进口手续。

【讨论】:

  • 感谢您的回复。我已经使用自动提交和其他方法调整了数据库。我发现当 INSERT 数百万条记录时 - 我的应用程序确实花费了不合理的时间。 SELECT 对这个数据当然是非常快的。我不得不重组我的数据库以使用 ProtocolBuffers 编写对象集合,效果非常好并且速度非常快 - 唯一的问题是我必须在我想使用数据时加载整个对象集合 - 但这对我来说就足够了.
  • @AndyTudor - 你能解释一下吗:“我不得不重组我的数据库以使用 ProtocolBuffers 编写对象集合,效果非常好并且速度非常快 - 唯一的问题是我必须加载整个集合每当我想使用数据时,对象的数量”。我面临着类似的挑战,想知道我是否也能做到这一点..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 2022-01-27
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多