【发布时间】: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 加载远程数据吗? (对不起,显而易见。)