[英]Query slow when use count(*) and inner join
我的查詢大約需要 5 秒才能運行。 它返回近 5000 條記錄。
SELECT
c.CompanyID,
c.CompanyName,
psr.PartnerSRFName,
psr.PartnerSRLName,
be.MonthlyFee,
(
SELECT Count(*)
FROM Units
INNER JOIN Properties ON Units.PropertyID = Properties.PropertyID
WHERE Properties.CompanyID = c.CompanyID
) 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
WHERE c.LeadSourceCompanyID = 1 AND Active = 1
如果我刪除Select Count(*) ...
,它運行得非常快,但我需要這些數據。 有沒有辦法改進這個查詢?
謝謝
Gordon Linoff 推薦的索引是必備的。
您可以做的另一件事是將計算從內聯查詢移動到連接子查詢。 這可能允許 RDBMS 優化查詢,因為現在明確不需要為每條記錄重復計算(只有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
的唯一列進行計數。 我不是這個的忠實粉絲,因為,通常,越早聚合,你獲得的效率就越高。
對於這個子查詢:
(Select Count(*)
From Units u join
Properties p
on u.PropertyID = p.PropertyID
Where p.CompanyID = c.CompanyID
) as TotalUnits
您需要properties(companyid, propertyid)
和units(propertyid)
索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.