Индексы, рекомендованные Гордоном Линоффом, являются обязательными.
Другая вещь, которую вы могли бы сделать, - это перенести вычисление из встроенного запроса в присоединенный подзапрос.Это может позволить СУБД оптимизировать запрос, поскольку теперь явно указывается, что нет необходимости повторять вычисления для каждой записи (на самом деле только отдельные значения CompanyID
имеют значение):
SELECT
c.CompanyID,
c.CompanyName,
psr.PartnerSRFName,
psr.PartnerSRLName,
be.MonthlyFee,
COALESCE(x.TotalUnits, 0) TotalUnits
FROM Company c
LEFT JOIN Partner_SalesRep_CompanyMap psrcm ON c.CompanyID = psrcm.CompanyID
LEFT JOIN Partner_SalesReps psr ON psrcm.Partner_SalesRepsID = psr.AssignedID
LEFT JOIN Billing_Exemption be ON be.CompanyID = c.CompanyID
LEFT JOIN (
SELECT Properties.CompanyID, COUNT(*) TotalUnits
FROM Units
INNER JOIN Properties ON Units.PropertyID = Properties.PropertyID
GROUP BY Properties.CompanyID
) x ON x.CompanyID = c.CompanyID
WHERE c.LeadSourceCompanyID = 1 AND Active = 1
Другой вариант - включить слияние подзапроса с внешним запросом (добавив больше соединений к внешнему запросу), включить агрегирование всего внешнего запроса и использовать уникальный столбец в таблице Units
или Properties
, чтобы выполнитьсчитатьЯ не большой поклонник этого, поскольку, как правило, чем раньше вы агрегируете, тем выше эффективность.