在论坛上阅读时,对于查询优化,在活动记录使用中,积极加载优于延迟加载。但是当我参加访谈时,人们告诉我们在某些情况下延迟加载是有用的。当我在Google中冲浪时,我找不到有关它的足够信息。谁能指导我理解这个概念。延迟加载与渴望加载
我的理解: 提前加载解决了检索关联记录时的N + 1查询问题。
请给我一些实际的情况
答案 0 :(得分:2)
何时需要延迟加载?
您要检索具有其他关联模型的条件(联接条件)的任何模型的数据,但又不想加载那些会浪费时间的关联表数据。
因此,延迟加载可以节省时间,因为您可以通过过滤来获取数据,但无需从数据库中加载关联的数据。
何时需要紧急加载?
您需要条件或没有条件,但同时也在调用它们的关联记录,因此最好尽快加载关联记录。因此,调用对象上的关联记录不会每次都针对每个对象在数据库上触发查询。
假设
@users是ActiveRecord::Relation
大小为80的集合对象(has_one:id_card),我为表调用了每个循环,如下所示,
@users.each do |user|
user.id_card.name
end
它将在IdCard模型表上触发查询80次。所以这很有效。
更新
includes
并不总是创建两个单独的查询,请阅读here。