Ruby on Rails迁移非常缓慢

时间:2009-12-24 23:33:45

标签: ruby-on-rails database performance sqlite

我有SQLite3数据库,其中填充了一些大数据集。 我使用迁移。

3个表将有以下记录数: Table_1将有大约10条记录    Table_1的每条记录将与表2中的约100条记录相关联       Table_2的每条记录将与Table_3

中的~2000条记录相关联

记录数约为10 * 100 * 2000 = 2000000

这需要很长时间......事件,如果我用大约20000条记录填充我的数据库,大约需要10分钟。

此外,我注意到,在迁移执行期间,ruby解释器仅占用CPU时间的5%,而95%仍未使用...

这种纯粹表现的原因是什么?

3 个答案:

答案 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)

Seed_fu可以提供帮助,正如本question

中所述