2012-01-05 79 views
8

我正在使用Apache Derby存儲數百萬的數量級的大量行。每次我開始批量插入時,我都會在表格中插入多達2百萬行。 該表具有作爲其主鍵的UUID和與另一個表中的UUID的單個約束。 插入需要幾個小時!爲什麼? 我已經在所有的表上創建了INDEXs,但是我已經刪除了這個,因爲我相信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速度?


編輯

我已經使用自動提交和其他調整的DB。我發現,當INSERT數百萬條記錄時 - 它確實會爲我的應用程序花費不合理的時間。選擇這些數據當然非常快。

+0

您知道您可以使用Derby將數據保留在磁盤上,並且可以從最後一個記錄ID加載遠程數據? _(對不起,很明顯。)_ – 2013-09-02 16:16:55

回答

8

您是否試過關閉自動提交模式?從http://db.apache.org/derby/docs/dev/tuning/tuningderby.pdf

插入在自動提交模式下可能會很痛苦,因爲每個提交都會爲每個INSERT語句更新磁盤上的日誌的 。直到 執行物理磁盤寫入,提交纔會返回。爲了加快速度:在自動提交虛假模式

  • 運行,在一個事務中執行多個刀片,並 然後明確地發出一個承諾。
  • 如果您的應用程序允許初始加載到表中,則可以使用導入 過程將數據插入表中。當使用這些接口將 加載到空表中時,德比將不會記錄單個插入。有關 導入過程的更多信息,請參閱Derby參考手冊 手冊和Derby服務器和管理指南。
+0

感謝您的回覆。我已經使用自動提交和其他方式調整了數據庫。我發現,當INSERT數百萬條記錄時 - 它確實會爲我的應用程序花費不合理的時間。選擇這些數據當然非常快。我不得不重構我的數據庫,使用ProtocolBuffers編寫對象集合,工作得非常好,而且速度非常快 - 唯一的問題是每當我想使用數據時都必須加載整個對象集合 - 但這對我來說是足夠的。 – 2012-02-29 09:42:22

+0

@AndyTudor - 你可以解釋一下:「我不得不重構我的數據庫,使用ProtocolBuffers編寫對象集合,工作得非常好,而且速度非常快 - 唯一的問題是我每次想使用時都要加載整個對象集合數據」。我面臨類似的挑戰,並想知道這是我能做的事情。 – donlys 2016-12-15 16:02:22