2016-10-13 6 views
0

Iは、以下のクエリの代替クエリを必要 - カウント(t2.TransactionId)が適切な結果を与えていない上記のクエリではGroup-Byを使用してSQLクエリのパフォーマンスを向上させるにはどうすればよいですか? (クエリの性能向上のために)

;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 

をし、そのため、私は交換しました下のサブクエリで -

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のカウントをより短時間で取得できる方法が必要です。以下は

表2のテーブル構造(表2には、主キーが存在しない)である -

enter image description here

答えて

0

あなたはCount列のための共同関連サブクエリを使用しています。私はこれがパフォーマンス上の問題を引き起こしていると思います。 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 

まだパフォーマンスの遅れなら、あなたは次にあなたがそのシングルセット(テーブル変数)にカウント、グループ化と個別に行うことができます。表変数(INSERT)にのみ、プレーンデータをフェッチすることができます。

これがあなたを助けてくれることを願っています!

関連する問題