在铁轨中急切加载和延迟加载

Arp*_*nav 31 ruby-on-rails ruby-on-rails-3

我对急切加载和延迟加载感到困惑,rails查询的性能有什么不同吗?

有没有办法实现这两种方式?

Vik*_*Vik 47

渴望加载

提高性能的一种方法是减少SQL查询的数量.您可以通过急切加载来完成此操作.

User.find(:all, :include => :friends)
Run Code Online (Sandbox Code Playgroud)

在这里你只发出两个查询:

1)一个适用于所有用户.

2)一个用户的所有朋友.

延迟加载:

如果有一个与许多对象相关联的对象,例如用户有很多朋友,并且您希望像在Orkut中那样显示列表,则会触发与朋友一样多的查询,以及对象本身的一个查询.

users = User.find(:all)
Run Code Online (Sandbox Code Playgroud)

然后查询每个用户朋友,例如:

users.each do |user|
  friend = Friend.find_by_user_id(user.id)
end
Run Code Online (Sandbox Code Playgroud)

这里

1)所有用户的一个查询.

2)N查询N否.用户朋友

看看:Rails 3:延迟加载与急切加载

希望能帮助你理解这一点.

  • 检查一下:http://www.spritle.com/blogs/2011/03/17/eager-loading-and-lazy-loading-in-rails-activerecord/ (8认同)
  • 延迟加载与不使用预先加载不一样."延迟加载是一种常用于计算机编程的设计模式,用于将对象的初始化推迟到需要它的位置.如果正确和适当地使用,它可以提高程序操作的效率." -Wikipedia`基本上,如果你的页面有一堆用户在滚动之前看不到的图像,你可以等到它向下滚动并看到图像加载它.那是懒加载. (5认同)

BKS*_*eon 15

渴望加载

加载你的枪(如在维克斯堡),等到你真的需要使用它.这是一种急切加载的政策.

亲:是一切都准备好了.

Con:你正在耗尽空间/内存.

延迟加载

一名年轻的海军军校学生问纳尔逊勋爵为什么不准备他的船:

"我不会早点加载我的枪......我只需加载1微秒即可开火." 他说.这是一个延迟加载策略.

延迟加载专业版:在您需要之前,您不会访问数据库.

Con:你将会在数据库中打N + 1次.....除非你选择了你想要的列并且你将它别名.例如

@products = Product.order("categories.name").joins(:category)
Run Code Online (Sandbox Code Playgroud)

使用延迟加载策略仅访问数据库一次:

当您product.category.name在视图模板中调用时,上述查询会在数据库中触发N + 1次- 其中product是@products关系中的单个对象.但是如果你使用别名,只需一个查询即可完成所有工作:

@products = Product.order("categories.name").joins(:category).select("products.*, categories.name as category_name")
Run Code Online (Sandbox Code Playgroud)

并使用它:product.category_name