Левые внешние соединительные рельсы с энергичной загрузкой в ​​том месте, где состояние - PullRequest
0 голосов
/ 07 июня 2018

У меня проблема с системой во время загрузки записей с условием где.

Я прочитал блог по ссылке .Это говорит о проблеме производительности при использовании, где условие с нетерпеливыми ассоциациями загрузки.

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

"Это генерирует два левых внешних соединения. Что произойдет, так это то, что база данных будет возвращать строку для каждой уникальной комбинации клиента, счета и квитанции. Поэтому, если у нас будет 25 клиентов, каждыйу клиента есть 10 счетов-фактур (всего 250) и 10 квитанций (всего 250). Возвращаемый набор результатов - это не 525 записей, а что-то ближе к 2500 записям. Теперь Rails должен инстанцировать все это в объекты ActiveRecord. "

Я не понимаю, как получается, что он генерирует 2500 записей?

1 Ответ

0 голосов
/ 07 июня 2018

Если есть 25 клиентов, каждый с 10 счетами и 10 квитанциями, то использование 'where' with 'includes' сгенерирует 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" })

Кроме того, каждый счет и квитанция будут существовать только как одна запись, а не дублироваться много раз, как в строках, возвращаемыхзапрос.

...