Количество запросов замедляется с увеличением количества записей - PullRequest
0 голосов
/ 22 октября 2019

У меня следующая структура таблиц:

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

Этот запрос часто используется в нескольких рабочих процессах. Однако проблема, наблюдаемая в настоящее время, заключается в том, что по мере увеличения количества записей о студентах, контактах и ​​каналах результаты этого запроса замедляются и время ожидания истекает. Есть ли какие-либо улучшения производительности или альтернативы могут быть предложены для того же?

1 Ответ

0 голосов
/ 22 октября 2019
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 field.FieldType IN (
        'Email'
        ,'Phone'
        ,'SMS'
        )
WHERE stud.CustomerId = @CustomerId
    AND map.ChannelId = @ChannelId

Здесь второй 'AND det.ContactId = map.ContactId' Я не понимаю необходимости в этом, потому что логика существует в другом JOIN. Кроме того, я присоединяюсь только к «FieldType» по интересам. Вы можете проверить, может ли это помочь с индексом

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...