Rails ActiveRecord Eager Load需要很长时间

我正在使用热切加载来加入我的两个表

Model1.eager_load(:model2) 

Model1表有大约800行,并且有许多对其他表的引用。 每当调用该行时,加载显示信息的视图大约需要3分钟。

然后,我试着建立一个直接的Postgres连接并运行从急切加载生成的相同的SQL查询,并在50ms内完成。

为什么在ActiveRecord中花费的时间更长,无论如何我可以减少时间?

在控制台中,它会转到以下SQL查询(当然这是一个简化版本),并且在它继续并加载页面之前它会挂起大约3分钟。

 SELECT model1.*, model2.* FROM model1 LEFT OUTER JOIN model2 ON model2 .foreign_key = model1.id 

这可能不是由于本身的急切加载,而是反映了实例化许多模型对象的开销。 ActiveRecord必须在从数据库中检索对象时初始化对象。 您可以通过向关联模型添加回调来certificate这一点:

 after_find :yodel def yodel puts "Yodel-ae-hoo!" end 

这是非常快的,但它不是瞬间的。 当您返回许多对象时,初始化时间将开始影响性能。

典型的解决方案是尽可能对结果进行分页。 否则,您可能需要使用原始SQL重新编写查询,以便更具选择性。