Я немного переработал первый запрос к этому (для удобства чтения)
SELECT LeadRetailerId, Count(*) as NumberGreenLeads
FROM [MBCH_LMT].[lead].[Contact] a
INNER JOIN [MBCH_LMT].[lead].[ContactActivity] b
ON b.ContactUID = a.UID
AND b.LeadStatusDate > DATEADD(Year, -1, GetDate())
WHERE a.LeadRetailerId in (@RetailerId)
GROUP BY a.LeadRetailerId
Хотя порядок вещей изменился, MSSQL (скорее всего) выполнит тот же план запроса.Первое, что я заметил, это то, что у вас есть a.LeadRetailerId in (@RetailerId)
в запросе.Планируете ли вы добавить дополнительные значения или это только это?Наличие нескольких значений в одной переменной не сработает, как вы могли подумать, что должно быстро показать некоторое простое экспериментирование.Если вы будете использовать только значение 1, вы можете заменить IN
на =
и упростить запрос до
SELECT LeadRetailerId = @RetailerId,
Count(*) as NumberGreenLeads
FROM [MBCH_LMT].[lead].[Contact] a
INNER JOIN [MBCH_LMT].[lead].[ContactActivity] b
ON b.ContactUID = a.UID
AND b.LeadStatusDate > DATEADD(Year, -1, GetDate())
WHERE a.LeadRetailerId = @RetailerId
, что может быть немного быстрее.
Продолжая ваше описание, я думаю, что вы используете что-то вроде этого:
SELECT LeadRetailerId, Count(*) as NumberGreenLeads
FROM [MBCH_LMT].[lead].[Contact] a
INNER JOIN [MBCH_LMT].[lead].[ContactActivity] b
ON b.ContactUID = a.UID
AND b.LeadStatusDate > DATEADD(Year, -1, GetDate())
WHERE a.LeadRetailerId in (@RetailerId1, @RetailerId2, @RetailerId3, @RetailerId4, @RetailerId5, etc)
GROUP BY a.LeadRetailerId
, где список увеличивается «по мере необходимости».Если это происходит медленно, вы можете проверить, есть ли у вас какие-либо индексы в таблицах, которые могут помочь MSSQL найти быстрый способ обработки этого.В идеале вы должны иметь индекс на a.LeadRetailerId
, который включает a.UID
для первой таблицы, а другой - для другой таблицы на b.ContactUID
и b.LeadStatusDate
CREATE INDEX idx_test ON [MBCH_LMT].[lead].[Contact] (LeadRetailerId) INCLUDE (UID)
CREATE INDEX idx_test ON [MBCH_LMT].[lead].[ContactActivity] (ContactUID, LeadStatusDate)
Имейте в виду, что этоускорит этот запрос, займет дополнительное место в базе данных и создаст некоторые накладные расходы, когда INSERT/UPDATE/DELETE
-ing на таблице.(нет такого понятия, как бесплатный обед и т. д., хотя я бы сейчас не слишком волновался об этом, преимущество индексов часто перевешивает накладные расходы ... при разумном использовании =)
Второй запрос немногостранно, что вы делаете GROUP BY b.ContactUID
.Я не знаком с вашей структурой таблиц, но вы уверены, что результат указанного запроса - это то, что вы хотите?В любом случае, если это так, то он должен извлечь выгоду из того же предлагаемого индекса в первой таблице.Для третьей таблицы я бы предложил:
CREATE INDEX idx_test ON [MBCH_LMT].[lead].[ContactActivityEscalationHistory] (ContactUID, EscalationLevel)
Одна из вещей, о которой следует помнить при работе с SQL, состоит в том, что система интерпретирует ваш запрос и разработает план выполнения, который она считает наиболее оптимальным.Этот план зависит не только от вашего запроса, но и от наличия индексов, количества и типов данных в таблицах, а иногда и от некоторой черной магии =)