我有SQLite3数据库,其中填充了一些大数据集。 我使用迁移。
3个表将有以下记录数: Table_1将有大约10条记录 Table_1的每条记录将与表2中的约100条记录相关联 Table_2的每条记录将与Table_3
中的~2000条记录相关联记录数约为10 * 100 * 2000 = 2000000
这需要很长时间......事件,如果我用大约20000条记录填充我的数据库,大约需要10分钟。
此外,我注意到,在迁移执行期间,ruby解释器仅占用CPU时间的5%,而95%仍未使用...
这种纯粹表现的原因是什么?
答案 0 :(得分: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 :(得分:1)
如果在自己的事务中运行每个INSERT
语句,SQLite可能非常非常慢。但是如果你在一个事务(或一组逻辑事务)中运行它,那么它可以非常快。
答案 2 :(得分:0)