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