Как структура сущности работает для большого количества записей?

c# database-design entity-framework entity-framework-6

Вопрос

Я вижу уже без ответа вопрос здесь .

Мой вопрос -

Действительно ли EF готово для крупного приложения?

Вопрос возник из этих основных вопросов -

  1. EF извлекает все записи в память, а затем выполняет операцию запроса. Как EF будет вести себя, когда таблица имеет около 1000 записей?
  2. Для простого редактирования мне нужно потянуть за редактирование записи, а затем нажать на db, используя SaveChanges()

Принятый ответ

Я столкнулся с аналогичной ситуацией, когда у нас была большая база данных со многими таблицами по 7-10 миллионов записей. мы использовали инфраструктуру Entity для отображения данных. Чтобы получить отличную производительность, вот что я узнал; Мои 10 золотых правил для платформы Entity :

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

  2. Да, (в некоторых случаях хранимые процедуры - лучший выбор, они не такие злые, как некоторые заставляют вас поверить), вы должны использовать хранимые процедуры там, где это необходимо. Импортируйте их в свою модель и импортируйте им функции. Вы также можете вызвать их непосредственно ExecuteStoreCommand (), ExecuteStoreQuery <> (). То же самое касается функций и представлений, но EF имеет действительно странный способ вызова функций «SELECT dbo.blah (@id)».

  3. EF работает медленнее, когда ему приходится заполнять Entity с глубокой иерархией. будьте предельно осторожны с объектами с глубокой иерархией

  4. Иногда, когда вы запрашиваете записи, и вам не требуется их изменять, вы должны сказать EF, чтобы он не наблюдал изменения свойств (AutoDetectChanges). в этом случае извлечение записей происходит намного быстрее

  5. Индексирование базы данных хорошо, но в случае EF это становится очень важным. Столбцы, которые вы используете для поиска и сортировки, должны быть правильно проиндексированы.

  6. Когда вы модель велика, модельный дизайнер VS2010 / VS2012 становится сумасшедшим. так что сломайте свою модель на модели среднего размера. Существует ограничение на то, что объекты из разных моделей не могут быть разделены, даже если они могут указывать на одну и ту же таблицу в базе данных.

  7. Когда вы должны вносить изменения в один и тот же объект в разных местах, используйте один и тот же объект, внесите изменения и сохраните его только один раз. Дело в том, что AVOID извлекает одну и ту же запись, внося изменения и сохраняя ее несколько раз. (Реальный наконечник усиления производительности).

  8. Когда вам нужна информация только в одном или двух столбцах, попробуйте не извлекать полный объект. вы можете либо выполнить свой sql напрямую, либо что-то вроде мини-объекта. Возможно, вам также понадобится кэшировать некоторые часто используемые данные в вашем приложении.

  9. Сделки медленны. будьте осторожны с ними.

  10. SQL Profiler или любой профилировщик запросов - ваш друг. Запустите его при разработке приложения, чтобы узнать, что EF отправляет в базу данных. Когда вы выполняете соединение с использованием выражения LINQ или Lambda в приложении ur, EF обычно генерирует запрос типа Select-Where-In-Select, который может не всегда работать хорошо. Если u найдет любой такой случай, сверните ur рукава, выполните присоединение к DB и получите EF результаты. (Я забыл этот, самый важный!)

если вы помните об этом, EF должен давать почти такую ​​же производительность, как обычный ADO.NET, если не тот же.


Популярные ответы

1. EF извлекает все записи в память, а затем выполняет операцию запроса. Как EF будет вести себя, когда таблица имеет около 1000 записей?

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

2. Для простого редактирования мне нужно потянуть запись, отредактировать ее, а затем нажать на db, используя SaveChanges ()

Это правда, но я бы не стал заниматься этим, если вы действительно не видите проблемы с производительностью. Поскольку 1. неверно, вы получите только одну запись из базы данных, извлеченной из базы данных до ее сохранения. Вы можете обойти это, создав SQL-запрос в виде строки и отправив его в виде простой строки.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему