Entity Framework ассоциации убивают производительность - PullRequest
1 голос
/ 23 апреля 2010

Вот тест производительности, на который я смотрю.У меня есть 8 различных объектов, которые являются таблицей для каждого типа.Некоторые из сущностей содержат более 100 тысяч строк.

Это конкретное приложение выполняет несколько рекурсивных вычислений на клиенте, поэтому я думаю, что было бы лучше предварительно загрузить данные, а не ленивую загрузку.Я не могу загрузить всю базу данных примерно за 3 секунды.Поскольку я добавляю ассоциации любым способом, производительность начинает резко падать.

Я загружаю все данные одинаково (просто вызываю toList() для сущности, присоединенной к контексту).Я запустил тест с классами, сгенерированными edmx и объектами самоконтроля, и получил схожие результаты.

Я уверен, что если бы я сам попытался разобраться с ассоциациями, как в случае с набором данных, проблема с производительностью исчезла бы.С другой стороны, я почти уверен, что это не то, как должна была использоваться структура сущностей.Есть мысли или идеи?

1 Ответ

0 голосов
/ 23 апреля 2010

Загрузка объектов со связями будет намного медленнее, чем загрузка сущностей, даже если связанные объекты не извлекаются во время загрузки, так как для этого потребуется создать сложный объект, используемый для отслеживания отношений в одном случае, по сравнению с простым значениемтипа как int в другом.Насколько медленнее вы это видите?

Но ...

Предварительная загрузка 100 тысяч строк звучит как очень плохая идея.Когда вы выполняете ToList (), вы исключаете любую возможность того, что EF и SQL могут выполнять любые виды оптимизированных запросов к вашим данным.Ваши расчеты таковы, что вам всегда нужно проверять все данные?Вы пробовали это без предварительной загрузки и исследовали запросы, которые это генерирует?Вы пытались использовать .Include, чтобы просто включить связанные объекты, которые, как вы знаете, вам понадобятся?

EF умело кеширует, если вы дадите ему такую ​​возможность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...