【问题标题】:Optimize Rails eager loading query for find all优化 Rails 急切加载查询以查找所有
【发布时间】: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?

【问题讨论】:

    标签: ruby-on-rails activerecord eager-loading


    【解决方案1】:

    这其实是一种优化,实际上Rails会在id的数量变多时改变查询策略。

    您也可以使用:join 而不是:include

    【讨论】:

    • 也可以在这里查看akitaonrails.com/2008/5/26/…“优化的急切加载”部分
    • 谢谢,knoopx!我想到,急切的加载必须不知道我是否实际上加载了所有表行,或者所有 foo 都匹配某些条件(因此,WHERE 子句将不包括所有 foo 的 id。)我现在正在尝试查找如果出于好奇而 id 的数量变高,Rails 会更改查询策略。哎呀,也感谢您的链接!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2019-12-27
    • 2015-08-05
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多