Есть ли способ улучшить производительность Linq-To-SQL?

Пожалуйста, дайте совет, если можете ...

Я основал свой проект на Linq-To-SQL, и (почти) готовое приложение имеет очень низкую производительность. Я много раз запускал профилировщик SQL, чтобы оптимизировать запросы с помощью LoadOptions, чтобы уменьшить количество обращений к серверу базы данных, но, в конце концов, моя головоломка сплетена в следующие моменты:

  1. Официальный совет Microsoft заключается в том, что DataContext не должен не иметь длительный срок жизни, то есть - они советуют вам создать DataContext, материализовать объекты, внести изменения, вызвать SubmitChanges (), а затем удалить. Мое приложение строго следует этому образцу.

  2. DataContext имеет тенденцию быть очень цепким к своим сущностям, и отсоединение и повторное присоединение (неизмененных) объектов из одного контекста к другому оказалось проблематичным, когда дело доходит до отслеживания изменений и загрузки отложенных отношений повторно присоединенных объектов. Таким образом, сохранение загруженного кэша объектов оказалось проблематичным.

  3. Когда LoadOptions заданы в DataContext для загрузки нескольких уровней отношений, производительность страдает, потому что результирующие данные являются продуктом связанных строк, а не их суммой. Конкретная схема, из которой я извлекаю данные, буквально вызывает 144-кратное увеличение объема данных, возвращаемых при установке LoadOptions, поэтому, естественно, это приводит к снижению производительности, а не помощнику.

  4. Без установки 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

Таким образом, моя проблема заключается в том, что получаемая мной производительность неприемлема для моего клиента и:

  1. Не рекомендуется использовать единый контекст DataContext для всего приложения.
  2. Кэширование и повторное прикрепление объектов (на первый взгляд) проблематично.
  3. При глубоких многоуровневых отношениях DataContext.LoadOptions снижает производительность
  4. Предварительная загрузка данных всей таблицы не помогает - DataContext по-прежнему обновляет загруженный объект при посещении отношения внешнего ключа.

Мне действительно кажется, что я упустил здесь что-то фундаментальное, возможно, в общем шаблоне дизайна, который я принял, и был бы признателен за любые лакомые советы, которые могут быть у вас для получения загруженного Object-Graph из DataContext без всех циклов. или раздутый сетевой трафик.

Твой совет?


person Mark    schedule 27.08.2009    source источник


Ответы (2)


Загляните на сайт http://www.sidarok.com/web/blog/content/2008/05/02/10-tips-to-improve-your-linq-to-sql-application-performance.html Надеюсь, это поможет.

person MemoryLeak    schedule 27.08.2009
comment
Спасибо за ссылку Хулиган. К сожалению, я принял во внимание большинство этих советов, но до сих пор не могу найти удовлетворительного результата. Опять же, я ценю ваше предложение! - person Mark; 28.08.2009

Я думаю, вы можете найти профилировщик базы данных, чтобы проверить, какой оператор SQL ваша программа LInqtoSQL отправляет в базу данных, и из которого вы могли бы найти что-то для оптимизации

person MemoryLeak    schedule 28.08.2009