Apache Derby& Java - 优化插入

时间:2016-04-19 14:00:33

标签: java sql database derby

我目前正在使用Apache Derby作为我的应用程序的临时本地数据库,并且我想了解如何优化INSERT性能的一些提示。

当应用程序启动时,它会从CSV文件中读取记录 - 这可能是数百万,但更可能是数十万。处理完毕后,最后的SELECT查询会汇总信息。

目前大约需要1分钟才能插入6000条记录。有3个表,其中2个存储唯一数据,一个是两者之间的查找表 - 它看起来如下:

CREATE TABLE table1
(id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
field1 VARCHAR(40))

CREATE TABLE table2
(id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
field1 VARCHAR(100),
field2 INT,
field3 VARCHAR(40))

CREATE TABLE table1table2lookup
(id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
field1 INT NOT NULL,
field2 INT NOT NULL)

我目前使用参数化 PreparedStatements 批处理来尝试提高速度。

我还关闭了自动提交模式,以便我只提交批量插入。

1 个答案:

答案 0 :(得分:3)

来自“Tuning Derby”doc

  

如果可能,请避免插入自动提交模式插入可能很痛苦   在自动提交模式下运行缓慢,因为每次提交都涉及更新   在每个INSERT语句的磁盘上登录。提交不会返回   直到执行物理磁盘写入。为了加快速度:跑进去   autocommit false模式,在一个事务中执行多个插入,   然后明确发出提交。

但是对于初始导入,您应该考虑使用导入过程直接从文件加载数据:

  

如果您的应用程序允许初始加载到表中,您可以   使用导入过程将数据插入表中。德比不会   使用时加载到空表中时记录各个插入   这些接口。 See“Derby工具和实用程序指南”   有关进口程序的更多信息。