1

我当前的 Rails 3 应用程序的性能下降,因为我向模式引入了更多关联。

这种性能与页面加载无关,而是与我使用 resque 运行的后台任务有关。该任务解析外部数据源以填充数据库。它通过自定义辅助方法(相当长的方法)来实现这一点。

我不期望任务执行得很快,因为它正在解析大量数据,但是最近在添加了一些额外的关联后,我看到我的测试方法的执行时间从 2 分钟增加到了 5 分钟左右。我在虚拟机上运行,​​所以也许这就是为什么它通常这么慢。

使用 ruby​​-prof,似乎大部分额外计算都用于处理我添加的关联的方法:

ActiveRecord::Associations::CollectionAssociation#* (where * is any number of methods)

当我添加关联时,我在关联表中包含了索引。但是,除此之外,我不确定我能做些什么来减轻我在添加这些关联时看到的性能影响。

所以我的问题是:

1) 添加关联是否会导致 Rails 应用程序的性能急剧下降?2) 让 Rails 应用程序具有许多执行良好的关联的最佳实践是什么?

编辑:根据要求提供一些附加信息

  • 数据库:Postgres
  • 我添加的关联都是 HABTM
  • 正是这些协会的填充占用了时间。在填充过程中,我正在创建数百个甚至数千个关联。对于批量插入,我一直在使用 activerecord-import,它显着加快了速度,但我不知道关联的等价物。
  • 我正在执行以下操作(为简单起见更改了变量):

    // flavors_array is an array of all the Flavor objects I want to associate with my ice_cream
    ice_cream.flavors = flavors_array
    
  • 我这样做是因为我确定地知道这个“ice_cream”实例没有预先存在的关联,我将使用“=”删除这些关联

  • 但是,这种方法仍然很慢
  • 重要提示:当我用 SQL 语句替换上述内容以将关联直接批量插入关联表(通过 ID)时,性能会显着提高。操作几乎不需要时间。
4

1 回答 1

0

您还需要分析您的查询,没有神奇的公式,而是评估“包含与连接”的用法。通常使用关联,除非需要,否则不会加载数据。

下面的 railscast 提供了很好的想法, http: //railscasts.com/episodes/181-include-vs-joins

急切加载可能有助于防止往返数据库,并可能提供更好的性能。

于 2013-03-13T06:35:53.577 回答