【问题标题】:Ruby on Rails migrations are very slowRuby on Rails 迁移非常缓慢
【发布时间】:2010-12-29 22:11:44
【问题描述】:

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

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

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

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

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

如此纯粹的表演的原因是什么?

【问题讨论】:

    标签: ruby-on-rails database performance sqlite


    【解决方案1】:

    很简单,通过手动一次保存一个 AR 对象来插入大量记录将需要数年时间。

    在插入大量数据时,速度和“清洁度”(即不是完全狡猾的 hack)之间的最佳折衷方案是 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 语句中。该死的快。

    【讨论】:

      【解决方案2】:

      如果您在自己的事务中运行每个INSERT 语句,SQLite 可能会非常非常慢。但是如果你在一个事务(或一组逻辑事务)中运行它,那么它可能会非常快。

      【讨论】:

      • 您能否更详细地解释一下 - 我如何在一个事务中刷新所有准备好的数据。我使用 Ruby on Rails 随机生成一些数据(用于测试目的)。我只知道 ActiveRecord:Base.save() 方法,但据我所知,它必须为每个创建的对象调用,而不是为整个模型调用......或者?
      【解决方案3】:

      Seed_fu 可以提供帮助,正如question 中所讨论的那样

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-17
        • 1970-01-01
        • 1970-01-01
        • 2012-10-28
        • 1970-01-01
        • 2015-04-09
        • 2019-12-24
        • 1970-01-01
        相关资源
        最近更新 更多