我当前的 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)时,性能会显着提高。操作几乎不需要时间。