簡體   English   中英

如何通過Group-by提高SQL查詢的性能?

[英]How to improve the performance of SQL Query with Group-By?

我需要以下查詢的替代查詢(以提高查詢性能)-

;WITH products as (SELECT DISTINCT Id3 FROM Table1 WHERE id ='abcd-1234-adfasd')    


SELECT t2.TransactionId ,count(t2.TransactionId) 
FROM Table2 AS t2
inner JOIN products AS p ON (t2.Id3 = p.Id3)                                  
WHERE ( (t2.Id1 != 'ggg-bbbccc-ttt')
AND (t2.CreatedTime > '2016-10-12T12:21:37.5088739')AND (t2.CreatedTime <= '2016-10-12T12:23:17.7377845')) AND (t2.Id2=2) 
GROUP BY t2.TransactionId
ORDER BY TransactionId

在上面的查詢中count(t2.TransactionId)沒有給出正確的結果,為此我將其替換為下面的子查詢-

SELECT t2.TransactionId ,(select count(1) from Table2 where TransactionId = t2.TransactionId) as trunacount
FROM Table2 AS t2
inner JOIN products AS p ON (t2.Id3 = p.Id3)                                  
WHERE ( (t2.Id1 != 'ggg-bbbccc-ttt')
AND (t2.CreatedTime > '2016-10-12T12:21:37.5088739')AND (t2.CreatedTime <= '2016-10-12T12:23:17.7377845')) AND (t2.Id2=2) 
GROUP BY t2.TransactionId
ORDER BY TransactionId

上面的查詢給出了正確的結果,但是與第一次查詢相比花費了一些時間。 因此,我需要一種可以在更少的時間內獲得TransactionId計數的方法。

下面是Table2的表結構(Table2中沒有主鍵)-

在此處輸入圖片說明

您正在使用與計數相關的子查詢列。 我認為這可能會導致性能問題。 因為與Co相關的子查詢將比較內部集的每個記錄和外部集的每個記錄。 我的建議是將其替換為LEFT JOIN。

    SELECT T2.TRANSACTIONID ,TRANS_COUNT.TRANSAC_COUNT AS TRUNACOUNT
    FROM TABLE2 AS T2
    INNER JOIN PRODUCTS AS P ON (T2.ID3 = P.ID3) 

    LEFT JOIN  
    (
    SELECT TRANSACTIONID, COUNT(1) TRANSAC_COUNT FROM TABLE2 GROUP BY  TRANSACTIONID
    )   AS TRANS_COUNT ON    T2.TRANSACTIONID =     TRANS_COUNT.TRANSACTIONID  


    WHERE ( (T2.ID1 != 'GGG-BBBCCC-TTT')
    AND (T2.CREATEDTIME > '2016-10-12T12:21:37.5088739')
    AND (T2.CREATEDTIME <= '2016-10-12T12:23:17.7377845')) AND (T2.ID2=2) 
    GROUP BY T2.TRANSACTIONID
    ORDER BY TRANSACTIONID

如果仍然存在性能滯后,則可以僅將純數據提取到表變量(插入)中,然后可以對該單個集合(表變量)進行計數,分組依據和不同。

希望這對您有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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