Сущность и производительность - PullRequest
2 голосов
/ 22 марта 2009

Я пытаюсь разработать свой первый веб-проект с использованием инфраструктуры сущностей, хотя мне нравится, что вы можете использовать linq вместо написания sql, у меня есть серьезные проблемы с производительностью. У меня в таблице много необработанных данных, которые я хотел бы сделать несколько преобразований, а затем вставить в другую таблицу. Я пробегаю все объекты и затем вставляю их в мою новую таблицу. Мне нужно сделать несколько небольших сравнений (именно поэтому мне нужно вставить данные в другую таблицу), но для тестирования производительности я удалил их. Следующий код (для настройки которого требуется приблизительно 12-15 свойств) занял 21 секунду, что довольно много времени. Обычно это так медленно, и что я могу сделать не так?

DataLayer.MotorExtractionEntities mee = new DataLayer.MotorExtractionEntities();
List<DataLayer.CarsBulk> carsBulkAll = ((from c in mee.CarsBulk select c).Take(100)).ToList();

foreach (DataLayer.CarsBulk carBulk in carsBulkAll)
{
    DataLayer.Car car = new DataLayer.Car();
    car.URL = carBulk.URL;
    car.color = carBulk.SellerCity.ToString();
    car.year = //... more properties is set this way

    mee.AddToCar(car);
}
mee.SaveChanges();

Ответы [ 4 ]

1 голос
/ 25 марта 2009

Нельзя создавать пакетные обновления с помощью Entity Framework.

Представьте, что вам нужно обновить строки в таблице с помощью оператора SQL, например:

UPDATE table SET col1 = @a where col2 = @b

При использовании SQL это всего лишь одна поездка на сервер. Используя Entity Framework, у вас есть (по крайней мере) одна поездка на сервер, загружающая все данные, затем вы модифицируете строки на клиенте, а затем он отправляет их обратно строка за строкой .

Это замедлит работу, особенно если ваше сетевое соединение ограничено, и если у вас больше пары строк.

Так что для такого рода обновлений хранимая процедура все еще намного эффективнее.

0 голосов
/ 22 марта 2009

вы можете попробовать то же самое в прямом SQL?

Возможно, проблема связана с вашей базой данных, а не с Entity Framework. Например, если у вас массивные индексы и множество проверочных ограничений, вставка может стать медленной.

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

Попытка этого в SQL напрямую скажет вам, действительно ли проблема в EF.

0 голосов
/ 22 марта 2009

Я думаю, что решил проблему. Я запускаю приложение локально, а база данных находится в другой стране (сосед, но тем не менее). Я попытался загрузить приложение на сервер и запустить его оттуда, а затем потребовалось всего 2 секунды, чтобы запустить вместо 20. Я попытался перенести 1000 записей, что заняло 26 секунд, что довольно актуально, хотя я не знать, является ли это «обычной» скоростью для сохранения 1000 записей в базе данных?

0 голосов
/ 22 марта 2009

Я довольно много экспериментировал со структурой сущностей и не видел реальных проблем с производительностью.

Какая строка вашего кода вызывает большую задержку, вы пытались его отладить и просто измерить, какой метод занимает больше всего времени?

Кроме того, сложность структуры вашей базы данных может немного замедлить структуру сущностей, но не до той скорости, о которой вы говорите. Есть ли какие-то «бесконечные циклы» в вашей структуре БД? Без структуры БД действительно трудно сказать, что не так.

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