左外连接导轨在哪里条件下急切加载

时间:2018-06-07 10:51:51

标签: ruby-on-rails ruby-on-rails-3 left-join eager-loading

我急切地在有条件的情况下加载记录时出现系统故障。

我在link上看过一篇博客。它在使用具有急切加载关联的条件时发出关于性能问题的说法。

Google Cloud Platform for Eclipse 1.7.0.201805302000

“这会产生两个左外连接。将要发生的是数据库将为客户,发票和收据的每个独特组合返回一行。因此,如果我们有25个客户,则每个客户有10个发票(250个)返回的结果集不是525条记录,而是接近2500条记录。现在Rails必须将所有这些记录实例化为ActiveRecord对象。“

我不知道怎么会产生2500条记录?

1 个答案:

答案 0 :(得分:1)

如果有25个客户,每个客户有10个发票和10个收据,那么在'where'中使用'where'将生成如下的SQL查询:

select ...
from customers 
left outer join invoices on invoices.customer_id = customers.id
left outer join receipts on receipts.customer_id = customers.id
where invoices.status = 'open'

假设所有发票都已打开,此查询将返回2500行,因为左外连接查询将创建客户,发票和收据表的所有可能组合,即25 x 10 x 10.这是左外连接的方式工作

然后,

ActiveRecord将获取这2500行,将它们合并在一起,并创建相当少的活动记录对象。

在生成的活动记录对象中,每条记录只存在一次。例如,@ customers数组中只有10个项目:

@customers = Customer.all.includes(:invoices, :receipts).where(invoices: { status: "open" })

此外,每张发票和收据只会作为单个记录存在,而不会像查询返回的行一样多次重复。