Быстрая вставка 4000+ записей в БД через Entity Framework

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для массовой вставки данных рекомендуется использовать EFCore.BulkExtensions. Данный инструмент исключает механизм отслеживания изменений Entity Framework из процесса, что позволяет осуществлять прямую и высокоэффективную запись данных.

Пример:

csharp
Скопировать код
context.BulkInsert(entitiesList); // Скорость звездолёта Enterprise! 🚀

Чтобы оптимально справиться с массовым внесением данных, рассмотрим методы, которые способствуют ускорению процесса.

Кинга Идем в IT: пошаговый план для смены профессии

Максимизация скорости

Группировка: Создание эффективных блоков из большого объема данных

Сформируйте группы записей и старайтесь избегать вызова SaveChanges() после каждой из них. Концентрирование вызовов базы данных помогает увеличить скорость обработки данных.

csharp
Скопировать код
foreach (var entity in entitiesList)
{
    context.Add(entity); //Собираем набор сущностей!
}   

context.SaveChanges(); //Производим запись данных!

Совет по пороговому значению: Экспериментируйте с размерами групп. Возможно, начните с размера около 100 и затем увеличьте его до 1000 или более, чтобы подобрать оптимальное значение.

Внимание, память: Большие объекты могут нагрузить вашу память. Определите безопасный предел и избегайте ошибок переполнения памяти.

Уменьшение нагрузки на отслеживание изменений

Отключите AutoDetectChangesEnabled в Entity Framework для ускорения работы. Так вы отмените внутреннее отслеживание изменений, которое может замедлять выполнение массовых операций.

csharp
Скопировать код
context.Configuration.AutoDetectChangesEnabled = false; // Выключаем автоотслеживание изменений для ускорения процесса.

Для сохранения высокой производительности регулярно обновляйте DbContext.

Управление транзакциями с вашей стороны!

Оберните операции в TransactionScope. Этот подход обеспечивает согласованность и целостность данных, что крайне важно при взаимодействии с базой данных.

csharp
Скопировать код
using(var transaction = new TransactionScope())
{
    // Здесь реализуются все предварительно отложенные операции!
    transaction.Complete(); // Завершаем транзакцию!
}

Асинхронность: ключ к эффективности!

Асинхронные методы, такие как BulkInsertAsync, помогут увеличить пропускную способность и поддержать отзывчивость вашего приложения.

Применение SQLBulkCopy: Обходим EF

В случаях с большим объем данных можно обойти Entity Framework и использовать SqlBulkCopy.

csharp
Скопировать код
using (var bulkCopy = new SqlBulkCopy(connection))
{
    //BulkCopy ожидает настройки
    // После этого производит быстрое копирование данных из источника в целевое место
}

Дополнительную информацию о возможностях SqlBulkCopy вы найдете в документации.

Настройка оптимизации

Отключите ValidateOnSaveEnabled для ускорения сохранения. Это очень поможет при вставке большого объема данных. Все мы любим быстрое сохранение, не так ли?

Понимание компромиссов

Entity Framework – замечательное средство для стандартных операций CRUD, однако у каждого супергероя есть свои слабые места. Для крупных задач raw SQL может стать спасительным кругом.

Визуализация

Визуализируем, как различные подходы влияют на скорость вставки при работе с Entity Framework:

Markdown
Скопировать код
- Стандартный метод `Add()`:
🐌💤: [📝, 📝, 📝, ..., 📝] (Один за другим. Нехватка скорости...)

- Метод `AddRange()`:
🐎💨: [📝📝📝📝📝📝📝📝📝] (Ого, как быстро! Группировка делает свое дело!)

- Использование расширения `BulkInsert`:
🚀💫: [[[[📝📝📝📝...]]]] (Это скорость света!)

Готовьтесь к вставке данных со скоростью света, оставив позади традиционные методы!

Подготовка к возможным сложностям

Важно быть готовым к трудностям, даже когда все кажется идеальным.

Управление нагрузкой на базу данных и таймаутами

Следите за нагрузкой, которую вы создаете для вашей базы данных. При внесении больших объемов данных неизбежно возникают проблемы перегрузки сервера. Устраните проблемы с тайм-аутами, оптимизировав размер блоков.

Особенности EF

Entity Framework – мощная среда, но она не предназначена для любых задач. Знайте ограничения его применения и не забывайте про проверенный стандарт – raw SQL!

Конкуренция: Закон двух пицц

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

Поддержание высокой скорости с EF Core

Если вы не можете обойти EF, научитесь добиваться от него максимальной привлекательности с EF Core.

  • EFCore.BulkExtensions способен помочь в быстрой вставке данных и при выполнении операций с upsert.
  • Обеспечьте плавное выполнение операций с BulkInsertOrUpdateOrDelete. Вот это понимают под работой с EF.
  • Если вы используете SqlBulkCopy в сочетании с EF, рассмотрите использование специального datareader для достижения наилучших результатов.

Полезные материалы

  1. EF Core Bulk Insert | Оптимизация вставки данных для EF6 и EF Core — параметры оптимизации процесса вставки данных с использованием Entity Framework.
  2. c# – Почему вставка сущностей в EF 4.1 так медленно, по сравнению с ObjectContext? – Stack Overflow — открытая дискуссия о свойствах EF при вставке данных.
  3. Data Points – Преимущества Code First в Entity Framework 6 | Microsoft Learn — рекомендации Microsoft о повышении производительности в EF.
  4. c# – Как можно ускорить DbSet.Add()? – Stack OverflowAdd vs AddRange: важное обсуждение для тех, кто хочет увеличить скорость работы с Entity Framework.
  5. Работа с хранимыми процедурами в Entity Framework Core — ничто так не проверено временем, как хранимые процедуры. Они особенно эффективны при массовой вставке данных в EF.