优化 Rails 急切加载查询以查找所有
Posted
技术标签:
【中文标题】优化 Rails 急切加载查询以查找所有【英文标题】:Optimize Rails eager loading query for find all 【发布时间】:2009-12-25 10:03:43 【问题描述】:在 Rails 2.3.5 应用程序中,我有以下模型:
class Foo < ActiveRecord::Base
has_many :bars
end
class Bar < ActiveRecord::Base
belongs_to :foo
end
当我打电话时
Foo.all(:include => :bars)
我在控制台中看到以下查询:
SELECT * FROM "foos"
SELECT "bars".* FROM "bars" WHERE ("bars".foo_id IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21))
在 where 子句中包含所有 foo 的 id。
我想这不是一个最佳查询,而 id 的数量可能很大,我需要预加载所有的“条”。另外,实际上我没有两个模型,而是一个链。
有没有办法让急切加载查询像
SELECT "bars".* FROM "bars"
什么时候使用 find all?
【问题讨论】:
【参考方案1】:这其实是一种优化,实际上Rails会在id的数量变多时改变查询策略。
您也可以使用:join
而不是:include
【讨论】:
也可以在这里查看akitaonrails.com/2008/5/26/…“优化的急切加载”部分 谢谢,knoopx!我想到,急切的加载必须不知道我是否实际上加载了所有表行,或者所有 foo 都匹配某些条件(因此,WHERE 子句将不包括所有 foo 的 id。)我现在正在尝试查找如果出于好奇而 id 的数量变高,Rails 会更改查询策略。哎呀,也感谢您的链接!以上是关于优化 Rails 急切加载查询以查找所有的主要内容,如果未能解决你的问题,请参考以下文章