Как избежать тормозов при срабатывании try catch? Добрый день, уважаемые коллеги.
Есть таблица с кучей записей, в которых поле Subscriber представлено в виде номера телефона и есть таблица соответствия номера телефона к ФИО(поле Subscriber и FIO). Соль в том, что не ко всем абонентам есть обозначения ФИО, в следствие чего обязательно будут выпадать исключения(Exceptions), которые я обрабатываю и оставляю там просто номер телефона.
Осуществляю выборку из SQL так:SELECT TOP 100 Calls.ID, Calls.DateTime, Calls.Trunk, Calls.Subscriber, Subscribers.FIO, Calls.ExtNum, Calls.Duration, Calls.Direction, Calls.ExitCode FROM Calls LEFT OUTER JOIN Subscribers ON Calls.Subscriber = Subscribers.Subscriber ORDER BY ID DESC
Дальше читаю:while (reader.Read())
{
rec = new CDRRecord();
rec.ID = reader.GetInt64(0);
rec.DateTime = reader.GetDateTime(1);
rec.Trunk = reader.GetString(2);
//Если значение из Subscribers.FIO не Null, присваиваем его записи,
//если null - будет Exception
try
{
rec.Subscriber = reader.GetString(4);
}
//тогда присваиваем записи значение Calls.Subscriber
catch
{
rec.Subscriber = reader.GetString(3);
}
rec.ExternalNumber = reader.GetString(5);
rec.Duration = TimeSpan.FromTicks(reader.GetInt64(6));
rec.Direction = reader.GetString(7);
rec.ExitCode = reader.GetString(8);
records.Add(rec);

}
Эта часть отрабатывает нормально за исключением того, что она очень сильно тормозит. Если делать выборку 100 записей, то зависает на 1 секунду - не особо критично, если 1000 может висеть до 5 секунд, причем без данной обработки тормозов не будет, однако хотелось бы, чтобы там где есть информация об абоненте она была, а где ее нет показывался бы просто номер телефона.
Тормоза обратно пропорциональны количеству данных в таблице Subscribers, что и логично — чем больше вызывается исключений, тем больше тормозов.
Прошу помочь либо изменить алгоритм, чтобы избежать исключений, либо подсказать как избежать тормозов в такой логике.
Я понимаю, что я делаю что-то не так, но вот где...
P.S. пробовал указывать конкретное исключение в catch:catch(SqlNullValueException)
эффекта никакого.

21 Авг 2019 в 06:33
217 +1
0
Ответы
1

Для избежания тормозов при срабатывании try catch можно попробовать следующий подход:

Попробуйте использовать условный оператор IF для проверки наличия значения в поле Subscribers.FIO перед его присвоением переменной rec.Subscriber. Например:if (!reader.IsDBNull(4))
{
rec.Subscriber = reader.GetString(4);
}
else
{
rec.Subscriber = reader.GetString(3);
}

Попробуйте оптимизировать ваш запрос SQL для уменьшения количества исключений. Например, можно попробовать использовать более точное условие соединения таблицы Subscribers, чтобы исключить записи без ФИО.

Если количество записей в таблице Subscribers очень велико, можно попробовать кэшировать данные из таблицы Subscribers перед выполнением основного запроса, чтобы избежать повторных обращений к базе данных внутри цикла.

Также, возможно, стоит обратить внимание на производительность вашей базы данных и оптимизировать индексы и запросы для ускорения выполнения запросов.

Надеюсь, эти рекомендации помогут вам уменьшить тормоза и улучшить производительность вашего кода.

20 Апр в 13:16
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 749 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир