簡體   English   中英

使用 count(*) 和內連接時查詢慢

[英]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

另一種選擇是將子查詢與外部查詢合並(通過向外部查詢添加更多連接),打開整個外部查詢的聚合,並使用表UnitsProperties的唯一列進行計數。 我不是這個的忠實粉絲,因為,通常,越早聚合,你獲得的效率就越高。

對於這個子查詢:

(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM