Как избежать тормозов при срабатывании 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
254 +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 Апр 2024 в 13:16
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир