2016-04-19 63 views
1

我目前正在使用Apache Derby作爲我的應用程序的臨時本地數據庫,我想了解如何優化INSERT性能的一些提示。Apache Derby和Java - 優化插入

當應用程序啓動時,它會從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) 

我目前使用參數化的PreparedStatement配料嘗試增加速度。

我也關掉了自動提交模式,以便我只在批量插入時提交。

+0

您是否嘗試過使用Derby的內置CSV文件導入工具?請參閱http://stackoverflow.com/a/2339690/193453 –

回答

3

從「調德比」 doc

避免在自動提交模式下插入如果可能的話刀片可以在自動提交模式痛苦 慢,因爲每次提交涉及到磁盤的每個INSERT在 日誌的更新聲明。在執行物理磁盤寫入之前,提交不會返回 。加快速度:在 autocommit假模式下運行,在一個事務中執行多個插入, ,然後明確地發出提交。

但是您最初的導入,你應該考慮使用進口手續,直接從文件加載數據:

如果您的應用程序允許初始加載到表中,您可以 使用導入將數據插入表的過程。在使用 這些接口加載到空表時,德比將不會記錄單個插入。 See德比工具和實用程序指南指南 有關導入過程的更多信息。