Быстрая вставка 4000+ записей в БД через Entity Framework
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для массовой вставки данных рекомендуется использовать EFCore.BulkExtensions. Данный инструмент исключает механизм отслеживания изменений Entity Framework из процесса, что позволяет осуществлять прямую и высокоэффективную запись данных.
Пример:
context.BulkInsert(entitiesList); // Скорость звездолёта Enterprise! 🚀
Чтобы оптимально справиться с массовым внесением данных, рассмотрим методы, которые способствуют ускорению процесса.
Максимизация скорости
Группировка: Создание эффективных блоков из большого объема данных
Сформируйте группы записей и старайтесь избегать вызова SaveChanges()
после каждой из них. Концентрирование вызовов базы данных помогает увеличить скорость обработки данных.
foreach (var entity in entitiesList)
{
context.Add(entity); //Собираем набор сущностей!
}
context.SaveChanges(); //Производим запись данных!
Совет по пороговому значению: Экспериментируйте с размерами групп. Возможно, начните с размера около 100 и затем увеличьте его до 1000 или более, чтобы подобрать оптимальное значение.
Внимание, память: Большие объекты могут нагрузить вашу память. Определите безопасный предел и избегайте ошибок переполнения памяти.
Уменьшение нагрузки на отслеживание изменений
Отключите AutoDetectChangesEnabled
в Entity Framework для ускорения работы. Так вы отмените внутреннее отслеживание изменений, которое может замедлять выполнение массовых операций.
context.Configuration.AutoDetectChangesEnabled = false; // Выключаем автоотслеживание изменений для ускорения процесса.
Для сохранения высокой производительности регулярно обновляйте DbContext.
Управление транзакциями с вашей стороны!
Оберните операции в TransactionScope
. Этот подход обеспечивает согласованность и целостность данных, что крайне важно при взаимодействии с базой данных.
using(var transaction = new TransactionScope())
{
// Здесь реализуются все предварительно отложенные операции!
transaction.Complete(); // Завершаем транзакцию!
}
Асинхронность: ключ к эффективности!
Асинхронные методы, такие как BulkInsertAsync
, помогут увеличить пропускную способность и поддержать отзывчивость вашего приложения.
Применение SQLBulkCopy: Обходим EF
В случаях с большим объем данных можно обойти Entity Framework и использовать SqlBulkCopy
.
using (var bulkCopy = new SqlBulkCopy(connection))
{
//BulkCopy ожидает настройки
// После этого производит быстрое копирование данных из источника в целевое место
}
Дополнительную информацию о возможностях SqlBulkCopy
вы найдете в документации.
Настройка оптимизации
Отключите ValidateOnSaveEnabled
для ускорения сохранения. Это очень поможет при вставке большого объема данных. Все мы любим быстрое сохранение, не так ли?
Понимание компромиссов
Entity Framework – замечательное средство для стандартных операций CRUD, однако у каждого супергероя есть свои слабые места. Для крупных задач raw SQL может стать спасительным кругом.
Визуализация
Визуализируем, как различные подходы влияют на скорость вставки при работе с Entity Framework:
- Стандартный метод `Add()`:
🐌💤: [📝, 📝, 📝, ..., 📝] (Один за другим. Нехватка скорости...)
- Метод `AddRange()`:
🐎💨: [📝📝📝📝📝📝📝📝📝] (Ого, как быстро! Группировка делает свое дело!)
- Использование расширения `BulkInsert`:
🚀💫: [[[[📝📝📝📝...]]]] (Это скорость света!)
Готовьтесь к вставке данных со скоростью света, оставив позади традиционные методы!
Подготовка к возможным сложностям
Важно быть готовым к трудностям, даже когда все кажется идеальным.
Управление нагрузкой на базу данных и таймаутами
Следите за нагрузкой, которую вы создаете для вашей базы данных. При внесении больших объемов данных неизбежно возникают проблемы перегрузки сервера. Устраните проблемы с тайм-аутами, оптимизировав размер блоков.
Особенности EF
Entity Framework – мощная среда, но она не предназначена для любых задач. Знайте ограничения его применения и не забывайте про проверенный стандарт – raw SQL!
Конкуренция: Закон двух пицц
При высокой степени конкуренции используйте оптимистическое согласование, чтобы избежать блокировок и обеспечить непрерывное выполнение операций.
Поддержание высокой скорости с EF Core
Если вы не можете обойти EF, научитесь добиваться от него максимальной привлекательности с EF Core.
EFCore.BulkExtensions
способен помочь в быстрой вставке данных и при выполнении операций с upsert.- Обеспечьте плавное выполнение операций с
BulkInsertOrUpdateOrDelete
. Вот это понимают под работой с EF. - Если вы используете
SqlBulkCopy
в сочетании с EF, рассмотрите использование специального datareader для достижения наилучших результатов.
Полезные материалы
- EF Core Bulk Insert | Оптимизация вставки данных для EF6 и EF Core — параметры оптимизации процесса вставки данных с использованием Entity Framework.
- c# – Почему вставка сущностей в EF 4.1 так медленно, по сравнению с ObjectContext? – Stack Overflow — открытая дискуссия о свойствах EF при вставке данных.
- Data Points – Преимущества Code First в Entity Framework 6 | Microsoft Learn — рекомендации Microsoft о повышении производительности в EF.
- c# – Как можно ускорить DbSet.Add()? – Stack Overflow — Add vs AddRange: важное обсуждение для тех, кто хочет увеличить скорость работы с Entity Framework.
- Работа с хранимыми процедурами в Entity Framework Core — ничто так не проверено временем, как хранимые процедуры. Они особенно эффективны при массовой вставке данных в EF.