2013-01-24 33 views
0

我們的一個需求是創建一個臨時內存數據庫,然後執行各種插入/選擇/更新。輕量級內存數據庫

一目瞭然SQLite滿足了我們所有的需求。連接到一個內存中的SQLite數據庫,可以建立簡單:

class SQLiteBase < ActiveRecord::Base 
    self.abstract_class = true 

    establish_connection(adapter: 'sqlite3', database: ':memory:') 
end 

前一段時間,我們已經開始尋找到一些服務表現的問題時,事實證明,我們需要進行批量加載(具體而言,散裝INSERT))數據到我們的SQLite表(參見these基準)。

不幸的是,它看起來像SQLite不支持批量插入。

因此是否有任何其他基於SQL的輕量級內存數據庫,支持批量插入

如果沒有這樣的 - 有沒有一種方法可以像內存數據庫一樣利用重量級數據庫,如PostreSQL(MySQL或任何其他主要播放器)?

如果postresql/mysql不是一種可行的方式 - 是否還有其他C語言重度優化的數據結構,並在其上面有查詢語言? (有/無紅寶石綁定)。

+0

您在這些測試中是否正確使用內存數據庫中的事務? –

回答

2

首先,SQLite的確實使用下面的方法支持批量插入:

  • 窮人的替代品多值INSERT:

    INSERT INTO mytable (a,b,c) SELECT 1 a, 2 b, 'x' c 
            UNION ALL SELECT 2, 5, 'y' 
            UNION ALL SELECT 3, 7, 'z' 
           ... 
    
  • 真正的多值INSERT,自SQLite 3.7.11支持:

    INSERT INTO mytable (a,b,c) VALUES (1,2,'x'), 
                (2,5,'y'), 
                (3,7,'z'); 
    
  • 使用事務:

    BEGIN; 
    INSERT INTO mytable (a,b,c) VALUES (1,2,'x'); 
    INSERT INTO mytable (a,b,c) VALUES (2,5,'y'); 
    INSERT INTO mytable (a,b,c) VALUES (3,7,'z'); 
    COMMIT; 
    

如果你問如何將這些目標變爲Ruby或Ruby on Rails的 - 我承認,我不知道,但我想它應該是可能的。

但是,即使SQLite不支持這些方法,對於內存中的數據庫,這些都不應該真正重要 - 因爲如果它實際上全部在內存中,插入速度不應該取決於您是否逐一插入行或作爲一項交易。您的速度限制實際上只是原始內存複製帶寬。

+0

謝謝,mvp。事實上,事實證明,SQLite支持從3.7.11開始的具有多個值的批量INSERT。 http://www.sqlite.org/changes.html。儘管我懷疑它的工作原理與您的第一個示例差不多 – gmile

+0

當我首先編寫我的答案時,我想包括多值插入,因爲我可以發誓我成功地使用了它,但是在測試時它不起作用。事實證明,我使用SQLite 3.7.10在盒子上進行了測試。更新的SQLite的確支持多值插入 - 我已經更新了我的答案。 – mvp

0

原來,SQLite支持從3.7.11開始批量插入。