В моей таблице transactionDetail содержится 300 миллионов данных. Для получения данных для моего запроса требуется очень много времени.
Ниже мой запрос
select
MerchantId as y_m,BoothId ,
TransactionTypeId ,
count(Amount) ,
sum(Amount)
from TransactionDetail
where TransactionDate>='2014-02-26'
and TransactionDate<'2019-02-27'
and not (BoothId like 'TEST%')
and MerchantId in (select MerchantId from MerchantGroup where MerchantClassId='MD-SAFAL')
group by MerchantId, BoothId, TransactionTypeId
order by y_m asc, BoothId asc, TransactionTypeId asc;
Таблица TransactionDetail имеет следующие ключи и индексы
TransactionId),Индексы ниже
КЛЮЧ idxTransactionDetail003 (MerchantId),
КЛЮЧ idxTransactionDetail004 (TransactionDate)
Таблица MerchantGroup имеет индекс в столбце MerchantId






вы можете добавить составной индекс для столбцов TransactionDetail ( MerchantId, TransactionDate, BoothId )
и вы можете использовать внутреннее соединение вместо предложения IN
и используйте not like вместо not (like)
select d.MerchantId as y_m
,d.BoothId
,d.TransactionTypeId
, count(d.Amount) , sum(d.Amount)
from TransactionDetail d
INNER JOIN (
select MerchantId
from MerchantGroup
where MerchantClassId='MD-SAFAL'
) t t.MerchantId = d.MerchantId
where d.TransactionDate>='2014-02-26'
and d.TransactionDate<'2019-02-27'
and d.BoothId not like 'TEST%'
group by d.MerchantId, d.BoothId, d.TransactionTypeId
order by y_m asc, d.BoothId asc, d.TransactionTypeId asc;
Добро пожаловать в stackoverflow.com. Здесь есть много вопросов по оптимизации запросов - найдите время, чтобы прочитать некоторые из них. Обратите внимание, какие из них проголосовали за или против / закрыты, и причины этого. Обратите внимание, на какие из них были даны полезные ответы. Вы описали немного схемы, задействованной в запросе (но не все), но не предоставили подробностей ни о распределении данных, ни о метриках. Отправной точкой для оценки производительности запросов всегда должен быть план
EXPLAIN.