UrbanRider
@UrbanRider

Как избежать тормозов при срабатывании 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)
эффекта никакого.
  • Вопрос задан
  • 431 просмотр
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Зачем вам не только исключения, но и вообще логика на приложении? Это поведение элементарно указывается в запросе.
SELECT TOP 100 Calls.ID, Calls.DateTime, Calls.Trunk, 
coalesce(Subscribers.FIO, Calls.Subscriber) as fieldname, -- если FIO NULL, тогда использовать значение поля Subscriber
...
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Перед обращением вызывайте IDataRecord.IsDBNull (int) вместо проверки try-catch.
Ответ написан
zagayevskiy
@zagayevskiy
Android developer at Yandex
Не надо использовать исключения для обработки потока выполнения программы. Исключения - это дорого. Сделайте нормальную проверку вместо этого.
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
По-моему тут с sql запроса надо бы идеологию сменить

что мешает обернуть в isnull Subscribers.FIO и вываливать в таком случае id или еще что-нибудь?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы