在铁轨中急切加载和延迟加载
我对急切加载和延迟加载感到困惑,rails查询的性能有什么不同吗?
有没有办法实现这两种方式?
渴望加载
提高性能的一种方法是减少SQL查询的数量。 您可以通过急切加载来完成此操作。
User.find(:all, :include => :friends)
在这里你只发出两个查询:
1)一个适用于所有用户。
2)一个用户的所有朋友。
延迟加载 :
如果有一个与许多对象相关联的对象,例如用户有很多朋友,并且您想要像在Orkut中那样显示列表,则会触发与朋友一样多的查询,以及对象本身的一个查询。
users = User.find(:all)
然后查询每个用户朋友,例如:
users.each do |user| friend = Friend.find_by_user_id(user.id) end
这里
1)所有用户的一个查询。
2)N查询N否。 用户朋友
看看: Rails 3:延迟加载与急切加载
希望能帮助你理解这一点。
渴望加载
加载你的枪(如在维克斯堡),等到你真的需要使用它。 这是一种急切加载的政策。
亲:是一切都准备好了。
Con:你正在耗尽空间/内存。
延迟加载
一名年轻的海军军校学员问纳尔逊勋爵为什么不准备他的船:
“我不会提前加载枪支…….我需要加载它才能加载它。” 他说。 这是一个延迟加载策略。
延迟加载专业版:在您需要之前,您不会访问数据库。
Con:你将会在数据库中打N + 1次…..除非你选择你想要的列并且你将它别名。 例如
@products = Product.order("categories.name").joins(:category)
使用延迟加载策略仅访问数据库一次:
当您在视图模板中调用product.category.name时,上述查询会在数据库中触发N + 1次 – 其中product是@products关系中的单个对象。 但是,如果您使用别名,只需一个查询即可完成所有操作:
@products = Product.order("categories.name").joins(:category).select("products.*, categories.name as category_name")
并使用它:product.category_name