我急切地在有条件的情况下加载记录时出现系统故障。
我在link上看过一篇博客。它在使用具有急切加载关联的条件时发出关于性能问题的说法。
Google Cloud Platform for Eclipse 1.7.0.201805302000
“这会产生两个左外连接。将要发生的是数据库将为客户,发票和收据的每个独特组合返回一行。因此,如果我们有25个客户,则每个客户有10个发票(250个)返回的结果集不是525条记录,而是接近2500条记录。现在Rails必须将所有这些记录实例化为ActiveRecord对象。“
我不知道怎么会产生2500条记录?
答案 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" })
此外,每张发票和收据只会作为单个记录存在,而不会像查询返回的行一样多次重复。