Как повысить производительность SQL-запроса с помощью Group-By?

#sql-server #group-by #inner-join

#sql-server #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
  

В приведенном выше запросе счетчик (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
  

И приведенный выше запрос дает правильный результат, но занимает немного больше времени по сравнению с первым запросом. Итак, мне нужен способ, с помощью которого я могу получить количество идентификаторов транзакций за меньшее время.

Ниже приведена структура таблицы Table2 (в Table2 нет первичного ключа)-

введите описание изображения здесь

Ответ №1:

Вы используете связанный с ним подзапрос для столбца 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), тогда вы можете выполнять Count, Group By и Distinct для этого одного набора (табличная переменная).

Надеюсь, это вам поможет!!