Свойства ассоциации, кошмарная производительность (Entity Framework) - PullRequest
1 голос
/ 27 января 2011

У меня довольно большая модель EF4, использующая код POCO gen. У меня есть много случаев, когда я выбираю одну сущность из любой таблицы по ее идентификатору.

Однако в некоторых таблицах это занимает 2 минуты или более, тогда как в большинстве таблиц это занимает менее секунды. У меня нет идей относительно того, где искать сейчас, потому что я не вижу никакой причины. Проблемы всегда возникают из-за одних и тех же таблиц, но я могу без проблем запрашивать их непосредственно у базы данных, поэтому проблема должна быть где-то на территории Entity Framework.

Строка довольно безобидна:

Dim newProd As New Product
Product.ShippingSize = Entities.ShippingSizes.Single(Function(ss) ss.Id = id)
  • идентификатор - это просто целое число, переданное из пользовательского интерфейса, идентификатор моего объекта - это первичный ключ, который индексируется в базе данных
  • Сущности - это недавно созданный экземпляр моей структуры сущностей. Datacontext
  • Это не первый запрос к контексту, это первый запрос к этому EntitySet, хотя
  • Я переиндексировал все таблицы, увидев сообщения о том, что поврежденный индекс может привести к медленному доступу, что не имеет никакого значения
  • Точно такая же строка кода для других таблиц запускается практически мгновенно, это только определенные таблицы
  • Эта таблица крошечная - в ней всего 4 вещи

Есть предложения, с чего начать?

- изменить - я упростил код в вопросе до такой степени, что проблема исчезла!

Ответы [ 2 ]

1 голос
/ 27 января 2011

Похоже, что это функция поведения Fixup шаблона POCO в сочетании с отложенной загрузкой.

Поскольку объект уже был загружен с помощью Single, последующие операции, похоже, происходят в памяти, а не в базе данных,По умолчанию метод Fixup выполняет вызовы Contains (), когда все останавливается, в то время как 10 тысяч элементов извлекаются, инициализируются как прокси и оцениваются в памяти.

Я пытался изменить это Contains ()в Where (Function (x) x.Id = id) .Count> 0 (будет логически делать то же самое, но пытаясь форсировать быструю операцию с БД вместо медленной в памяти).Запрос все еще выполнялся в памяти и так же медленно.

Я переключился с POCO на стандартный EntityGenerator, и эта проблема просто исчезла без каких-либо других изменений.Скажите, что вы будете о шаблонах / практиках, но это неприятная проблема - я не замечал этого, пока не переключился с поддельных и небольших тестовых баз данных на полноразмерную базу данных.Entity Generator сохраняет день сейчас.

1 голос
/ 27 января 2011

С чего начать?

  1. Распечатать или записать фактическую строку SQL, которая отправляется в базу данных.
  2. Выполнить эту литеральную строку на сервере и измерить ее производительность.
  3. Используйте систему плана EXPLAIN вашего сервера, чтобы увидеть, что на самом деле делает сервер.
  4. Сравните производительность необработанного SQL с производительностью EF.

Это должно сказать вам, есть ли у вас проблема с базой данных или проблема с EF.

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