У меня следующая структура таблиц:
tb_Students
CustomerId StudentId StudentName
1 1 Michael
1 2 Sam
2 1 Declan
tb_Contact_Detail
StudentId ContactId CustomerId ContactName Relation
1 1 1 Rory Father
1 2 1 Rachel Mother
tb_Channel
ChannelId ChannelName
1 Emergency
2 GeneralInfo
tb_Contact_Channel_Mapping
CustomerId ChannelId StudentId ContactId
1 1 1 2
1 2 1 2
1 2 1 1
tb_Contact_Fields
CustomerId ContactId ContactType(Phone/SMS/Email)
1 1 Phone
1 1 Email
1 1 SMS
1 2 Email
1 2 SMS
SELECT @EmailCnt = ISNULL(SUM(CASE WHEN field.FieldType = 'Email' THEN 1 ELSE 0 END), 0),
@PhoneCnt = ISNULL(SUM(CASE WHEN field.FieldType = 'Phone' THEN 1 ELSE 0 END), 0),
@SMSCnt = ISNULL(SUM(CASE WHEN field.FieldType = 'SMS' THEN 1 ELSE 0 END), 0)
FROM tb_Students stu WITH (NOLOCK)
INNER JOIN tb_Contact_Detail det WITH (NOLOCK) ON stu.CustomerId = det.CustomerId
AND stu.StudentId = det.StudentId
INNER JOIN tb_Contact_Channel_Mapping map WITH (NOLOCK) ON det.CustomerId = map.CustomerId
AND det.StudentId = map.StudentId
AND det.ContactId = map.ContactId
INNER JOIN tb_Contact_Fields field WITH (NOLOCK) ON det.CustomerId = field.CustomerId
AND det.ContactId = map.ContactId
WHERE stud.CustomerId = @CustomerId
AND map.ChannelId = @ChannelId;
For ChannelId=1, CustomerCode=1
Result id EmailCount 2, PhoneCount 1, SMSCount 2
Этот запрос часто используется в нескольких рабочих процессах. Однако проблема, наблюдаемая в настоящее время, заключается в том, что по мере увеличения количества записей о студентах, контактах и каналах результаты этого запроса замедляются и время ожидания истекает. Есть ли какие-либо улучшения производительности или альтернативы могут быть предложены для того же?