Как избежать тормозов при срабатывании 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) эффекта никакого.
Для избежания тормозов при срабатывании 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 перед выполнением основного запроса, чтобы избежать повторных обращений к базе данных внутри цикла.
Также, возможно, стоит обратить внимание на производительность вашей базы данных и оптимизировать индексы и запросы для ускорения выполнения запросов.
Надеюсь, эти рекомендации помогут вам уменьшить тормоза и улучшить производительность вашего кода.
Для избежания тормозов при срабатывании 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 перед выполнением основного запроса, чтобы избежать повторных обращений к базе данных внутри цикла.
Также, возможно, стоит обратить внимание на производительность вашей базы данных и оптимизировать индексы и запросы для ускорения выполнения запросов.
Надеюсь, эти рекомендации помогут вам уменьшить тормоза и улучшить производительность вашего кода.