#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 для этого одного набора (табличная переменная).
Надеюсь, это вам поможет!!