什么时候使用 preload 或 eager_load 或includes更好?

问题描述 投票:0回答:2
SQL 包含连接 将关联记录加载到内存中 执行两个查询
预加载 是的 是的
包括 是(左外连接) 是的 有时
急切负载 (左外连接) 是的

我从概念中知道了。

我想知道什么时候使用哪个API。我搜索但没有找到确切的答案。

ruby-on-rails
2个回答
7
投票

includes
选择是否使用
preload
eager_load
。如果您对
includes
做出的决定不满意,则必须诉诸使用
eager_load
preload


来自 https://engineering.gusto.com/a-visual-guide-to-using-includes-in-rails/:

:includes什么时候使用:preload?

在大多数情况下 :includes 将默认使用方法 :preload ,这将触发 2 个查询:

  • 加载与主导模型相关的所有记录
  • 根据关联模型或主导模型上的外键加载与主导模型关联的记录

:includes什么时候使用:eager_load?

:includes 将默认使用 :preload ,除非您引用在后续子句中加载的关联,例如 :where 或 :order。以这种方式构建查询时,您还需要显式引用急切加载的模型。

Employee.includes(:forms).where('forms.kind = "health"').references(:forms)

0
投票

所有这些方法都有助于远离 N+1 查询问题,它们之间的关键区别在于你想要如何查询:

  1. 预加载:2 个 SQL 查询
  2. 包含:如果是简单查询,则2条sql查询;否则左连接已使用
  3. eager_load:左连接 所有这些都在内存中临时加载和存储数据。
© www.soinside.com 2019 - 2024. All rights reserved.