2013-03-12 46 views
1

我的当前Rails 3应用程序已经看到性能下降,因为我向模式引入了更多关联。由于关联导致Rails应用程序性能下降?

该性能与页面加载无关,而是与使用resque运行的后台任务无关。该任务分析外部数据源以填充数据库。它通过一个自定义帮助器方法(很长一段时间)来完成。

我不希望任务执行得很快,因为它解析了很多数据,但最近在添加了一些其他关联之后,我看到了我的测试方法的执行时间从2分钟增加到了大约5分钟。我在虚拟机上运行,​​所以也许这就是为什么它总体上非常慢。

使用红宝石教授,似乎额外计算的大部分在处理我加入了协会方法是花:在关联表

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)的,第性能显着提高。这些行动几乎没有时间。
+0

您使用的数据库是?你的关系定义在你的模型中是什么样的?您是否尝试过在查询上运行[EXPLAIN](http://guides.rubyonrails.org/active_record_querying.html#running-explain)和/或查看日志(通常包含原始SQL和时间信息)以查看导致它们的原因太慢了? – Ari 2013-03-13 02:08:19

+0

@Ari,请参阅我的额外编辑。 – Kohanz 2013-03-13 13:25:39

回答

0

您还需要分析您的查询,没有神奇的公式,但评估“包括vs连接”的用法。通常与关联,数据不加载,除非需要。

下railscast提供这方面的好主意, http://railscasts.com/episodes/181-include-vs-joins

预先加载可能有助于防止往返DB和可以提供更好的性能。

相关问题