У меня есть модель данных, состоящая из нескольких сущностей, все они связаны между собой, всего около 80 таблиц.
Я начинаю получать код в рабочем виде, и в процессе я нахожусьпереключение с отложенной загрузки всего (это облегчило мою жизнь при разработке) на ускоренную загрузку в тех случаях, когда мне не нужны все связанные данные, или просто представляет слишком много данных для отправки клиенту, это просто трата пропускной способности.
Тем не менее, я только что заметил, что, по крайней мере, для некоторых сущностей стремление загрузить только то, что мне нужно, значительно медленнее, чем отложенная загрузка всех данных.
Вот пример, который я могу загрузитьобъект «запроса» лениво:
db.ContextOptions.LazyLoadingEnabled = true;
request = db.requests.Where(rq => rq.idrequest == rID).FirstOrDefault();
или с нетерпением:
db.ContextOptions.LazyLoadingEnabled = false;
request = db.request_objects.Include("service_objects.task_objects.task_parameters.parameter_values.address1").Include("service_objects.task_objects.task_parameters.parameter_values.attachment").
Include("service_objects.task_objects.task_parameters.parameter_values.phone_nbrs").Include("service_objects.task_objects.task_parameters.parameter_values.stored_texts").
Include("service_objects.task_objects.parent_tasks").Include("service_objects.task_objects.contact_objects").
Include("service_objects.service_parameters.parameter_values.address1").Include("service_objects.service_parameters.parameter_values.attachment").
Include("service_objects.service_parameters.parameter_values.phone_nbrs").Include("service_objects.service_parameters.parameter_values.stored_texts").
Include("service_objects.stored_texts").
Include("request_attachments.attachment").Include("request_notes.note").
Include("request_contacts.contact_objects").Include("contact_objects").
Include("contact_objects1").Include("contact_objects2").
Include("request_objects_links.request_objects1").Include("stored_texts").
Include("company_objects").
Where(ro => ro.idrequest_objects == rID).FirstOrDefault();
В большинстве случаев стремительная загрузка запроса выполняется в сотни или тысячи раз (!!!) медленнее, чемленивая загрузка, хотя чаще всего ленивая загрузка будет загружать МНОГО дополнительных данных.Я имею в виду, что при активной загрузке это занимает от 2 до 3 секунд, в то время как в большинстве случаев это занимает менее 40 мс (часто менее 10 мс) при отложенной загрузке (я получал это время с помощью System.diagnostics.Stopwatch).
Я не эксперт по SQL, и я ничего не знаю об оптимизации SQL, но я не могу понять, почему загрузка меньшего количества данных стоит дороже.
Любое понимание илиочевидная ошибка с моей стороны?Спасибо!
РЕДАКТИРОВАТЬ
Судя по ответу Брокенгласс, я не достаточно ясно: о).Этот код является лишь частью сервисной функции WCF, довольно просто:
[OperationContract]
public request LoadRequestByID(int rID)
{
request res = null;
try
{
DBEntities db = new DBEntities();
res = db.request_objects.Where(ro => ro.idrequest_objects == rID).FirstOrDefault();
}
catch (Exception e)
{
//Error log
}
return res;
}
Я решил рассчитать время, когда заметил, что отображение деталей запроса на стороне клиента заняло значительно больше времени (после вызова вышеупомянутогофункция) при активной загрузке, а не при отложенной загрузке.