Apache Derby INSERTS很慢

时间:2012-01-05 16:05:27

标签: java database derby

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

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)。我现在拥有的数据库模型很好地满足了我的目的,我不愿意改变它。 难道我做错了什么 ? ......还是期待太多? 有没有办法提高INSERT速度?


修改

我已经使用autocommit和其他人调整了数据库。我发现当INSERT数百万条记录时 - 我的申请需要花费不合理的时间。对这些数据的选择当然非常快。

1 个答案:

答案 0 :(得分:8)

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

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

  • 以autocommit false模式运行,在一个事务中执行多个插入,以及 然后明确发出提交。
  • 如果您的应用程序允许初始加载到表中,您可以使用导入 将数据插入表中的过程。 Derby不会记录单个插入的时间 使用这些接口加载到空表中。请参阅Derby参考 有关详细信息,请参见手册和“Derby服务器和管理指南” 进口程序。