Пожалуйста, дайте совет, если можете ...
Я основал свой проект на Linq-To-SQL, и (почти) готовое приложение имеет очень низкую производительность. Я много раз запускал профилировщик SQL, чтобы оптимизировать запросы с помощью LoadOptions, чтобы уменьшить количество обращений к серверу базы данных, но, в конце концов, моя головоломка сплетена в следующие моменты:
Официальный совет Microsoft заключается в том, что DataContext не должен не иметь длительный срок жизни, то есть - они советуют вам создать DataContext, материализовать объекты, внести изменения, вызвать SubmitChanges (), а затем удалить. Мое приложение строго следует этому образцу.
DataContext имеет тенденцию быть очень цепким к своим сущностям, и отсоединение и повторное присоединение (неизмененных) объектов из одного контекста к другому оказалось проблематичным, когда дело доходит до отслеживания изменений и загрузки отложенных отношений повторно присоединенных объектов. Таким образом, сохранение загруженного кэша объектов оказалось проблематичным.
Когда LoadOptions заданы в DataContext для загрузки нескольких уровней отношений, производительность страдает, потому что результирующие данные являются продуктом связанных строк, а не их суммой. Конкретная схема, из которой я извлекаю данные, буквально вызывает 144-кратное увеличение объема данных, возвращаемых при установке LoadOptions, поэтому, естественно, это приводит к снижению производительности, а не помощнику.
Без установки LoadOptions (или даже при установке ее на пониженном уровне) DataContext выполняет сотни обращений к базе данных.
Я также заметил, что DataContext игнорирует тот факт, что объект уже загружен при первом посещении объекта через отношения ... например:
Dim allCustomers as Customers() = Context.Customers.ToArray()
Dim allOrders as Orders() = Context.Orders.ToArray()
For Each o as Order in allOrders
Console.WriteLine(o.Customer.Name) ' <- Triggers round-trips to database!!!
Next
Таким образом, моя проблема заключается в том, что получаемая мной производительность неприемлема для моего клиента и:
- Не рекомендуется использовать единый контекст DataContext для всего приложения.
- Кэширование и повторное прикрепление объектов (на первый взгляд) проблематично.
- При глубоких многоуровневых отношениях DataContext.LoadOptions снижает производительность
- Предварительная загрузка данных всей таблицы не помогает - DataContext по-прежнему обновляет загруженный объект при посещении отношения внешнего ключа.
Мне действительно кажется, что я упустил здесь что-то фундаментальное, возможно, в общем шаблоне дизайна, который я принял, и был бы признателен за любые лакомые советы, которые могут быть у вас для получения загруженного Object-Graph из DataContext без всех циклов. или раздутый сетевой трафик.
Твой совет?