Я пытаюсь вставить массу данных в базу данных SQL-сервера, и мой вопрос в том, как часто я должен сохранять, когда туда будут вставлены миллионы записей. Эффективно ли сохранять его после, например. 10 000 вставок или после 1 000 000 вставок? Есть ли какие-то ценности? Я использую C# Entity Framework для заполнения сервера данными, поэтому я использую класс DBContext, который обрабатывает CRUD и сохраняет.
Вопрос
Частое сохранение базы данных эффективно с миллионами записей?
- что ты имеешь в виду под словом "сохранить"? После запуска команды INSERT данные для этой строки (или строк) находятся в базе данных, если вы не используете транзакции, и в этом случае они ждут, пока вы не зафиксируете транзакцию. Как именно вы вставляете данные? Или вы говорите о создании резервной копии, возможно? Также почему вы думаете, что изменение этой точки сохранения может повлиять на эффективность? В каком смысле? Что вы ожидаете получить? Боюсь, не совсем понятно, о чем вы спрашиваете. ADyson 10.08.2018
- Это очень широкий вопрос. Судя по вашему вопросу, SQL Server не является единственным звеном в цепочке обработки. SQL Server спроектирован так, чтобы быть высокоэффективным, но он также должен знать, что вы хотите, чтобы он делал эффективно, поэтому дизайн базы данных является основным фактором (структура таблиц, индексация и т. д.). На самом деле мы никак не можем ответить на этот вопрос, не зная архитектуры вашего приложения. squillman 10.08.2018
- Ах, так вы, возможно, говорите об использовании SaveChanges() в структуре сущностей? Это эффективно фиксирует транзакцию в фоновом режиме. Я не думаю, что это сильно повлияет на эффективность, хотя само по себе это очень широкое понятие. Если вы выполняете такую массовую загрузку, я предполагаю, что на данный момент вы не беспокоитесь о параллельном доступе, или нет? Если вы хотите ускорить процесс загрузки в целом, просто не используйте Entity Framework вообще, используйте подходящий инструмент для массовой загрузки. ADyson 10.08.2018
- ericlippert.com/2012/12/17/performance-rant mjwills 10.08.2018
- Не забудьте установить AutoDetectChangesEnabled = false; в DbContext. См. здесь заголовок ="почему вставка объектов в ef 4 1 происходит так медленно по сравнению с objectcontext"> stackoverflow.com/questions/5943394/ Gauravsa 10.08.2018
- Спасибо, ребята, за ваши ответы и предложения! Julian Peil 10.08.2018
Ответы
Ответ 1 · рейтинг 3 · TomTom
Я использую C# Entity Framework для заполнения сервера данными
Ваши проблемы начинаются здесь. Он не подходит для этого. НЕПРАВИЛЬНЫЙ ИНСТРУМЕНТ. Мне нравится Entity Frameowrk, но это ORM, а не инструмент массовой загрузки.
Обычно я использую класс SqlBulkLoader для загрузки до 65 тыс. записей во временную таблицу (за секунды, но будьте осторожны, вы в значительной степени должны использовать временную таблицу), которую я копирую в конечную таблицу одной командой/транзакцией.
Обработка 4-5 потоков параллельно на полной скорости.
Entity Framework займет часы для миллиона строк, независимо от того, как вы его включите. Просто неправильный инструмент.
Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.
Похожие материалы
- 50 вопросов по SQL-запросам с примерами кода - часть 4
- Станьте экспертом по SQL: полное руководство по разработке баз данных
- Решение дилеммы данных: эффективная загрузка данных CSV в базу данных SQL
- Отношения в SQL pt. 1 - Таблицы для проектирования
- Каким был бы надежный способ получить дробное значение от числа?
- Отображение нескольких записей с использованием набора результатов