2009-12-24 194 views
1

我有SQLite3數據庫,裏面填充了大量的數據。 我使用遷移。Ruby on Rails遷移非常緩慢

3個表將具有以下的記錄計數: TABLE_1將有大約10個記錄 TABLE_1的每個記錄將與〜100個記錄中TABLE_2 TABLE_2的每個記錄將與相關聯的相關聯〜2000條記錄在TABLE_3

記錄數將約爲10 * 100 * 2000 = 2000000

這需要很長時間...事件,如果我用大約20000條記錄填充我的數據庫,大約需要10分鐘。

而且,我已經注意到,那個,遷移執行過程中,Ruby解釋器的CPU時間只需要5%和95%處於閒置狀態...

什麼這樣的純性能的原因是什麼?

回答

2

很簡單討論,通過手動保存AR插入大量的記錄對象一次一個將要花費數年。

插入大量數據的速度和「乾淨度」(即不是一個完整的惡意破解)之間的最佳折衷是ar-extensions(http://github.com/zdennis/ar-extensions)導入方法。這並不理想,但它比我能找到的任何替代方法都要好,並且語法很乾淨,並且不需要你下降到原始的sql(或任何關閉的地方)。

示例語法:

items = Array.new 
1.upto(200) do |n| 
    items << Item.new :some_field => n 
end 
Item.import items, :validate => false 

至少在MySQL這將批次中的記錄與多組值的單個INSERT語句。該死的速度太快了。

1

如果你在它自己的事務中運行每個INSERT語句,SQLite可能非常非常慢。但是,如果你在一次交易(或一組邏輯交易)中運行它,那麼它可以非常快。

+0

您能否詳細解釋一下 - 我如何在一次事務中刷新所有準備好的數據。我使用Ruby on Rails隨機生成一些數據(用於測試目的)。 我只知道ActiveRecord:Base.save()方法,但據我所知,它必須爲每個創建的對象調用,但不適用於整個模型...或者? – AntonAL