0

У меня есть мой первый проект с Entity Framework и SQL Server Compact.Как увеличить производительность вставки базы данных с помощью Entity Framework

В базе данных имеется около 15 таблиц, все из которых имеют внешние ключи для других таблиц. Мне нужно прочитать тысячи XML-файлов и импортировать их данные в базу данных. Структура базы данных отражает структуру файла XML. Существует иерархия таблицы с до 5 уровнями. Поэтому для каждой записи в «верхней» таблице мне нужно вставить одну или несколько из базовых таблиц.

Я использую Entity Framework для вставки, и он отлично работает, но производительность очень плохая :( Я думаю, что основная проблема заключается в том, что для большинства записей идентификатор должен быть считан для использования для записей в лежащие в основе таблицы

другое дело, что -., если я знаю, что правильно -.? что Entity Framework вставляет каждую запись с отдельной командой

есть ли способ увеличить производительность резко

Спасибо

+0

Если производительность является проблемой, самым простым решением является ручной SQL-запрос. – Kilazur

+0

Это однократное (инициализация) действие? Затем вы можете отключить все ограничения на сервере sql. Это ускорит работу. Но убедитесь, что вы вставляете только действительные данные. После вставки снова включите ограничения. –

ответ

0

Используйте библиотеку SQL Compact Bulk Insert Library, чтобы вставить данные в пакеты.

Если вам нужно обновить все записи, а затем использовать эту технику:

  1. Создание промежуточной таблицы в базе данных
  2. Используйте библиотеку навалом вставить в промежуточную таблицу
  3. Затем выполните хранимую процедуру выполнения обновления путем чтения из промежуточной таблицы и обновления записей целевой таблицы.
+0

Спасибо за этот намек. Я не знаю, как получить идентификаторы вставленных строк? Мне нужны они в качестве ссылок для вставок в других таблицах. – BitEater

+0

Вы можете предварительно определить значения клавиш и установить опцию INDENTITY_INSERT ON – ErikEJ

0

Во-первых, убедитесь, что используете AddRange или альтернативные решения, чтобы не получить плохой результат производительности из-за метода DetectChanges.

См: http://entityframework.net/improve-ef-add-performance

Отказ от ответственности: Я владелец Entity Framework Extensions

Эта библиотека поддерживает все основные поставщика, включая SQL Server Compact

По умолчанию BulkInsert автоматически получить идентификаторы вставленных строк.

Эта библиотека позволяет выполнять все массовые операции, необходимые для сценариев:

  • Сыпучие SaveChanges
  • Bulk Вставьте
  • Bulk Удалить
  • Массовое обновление
  • Bulk Слияние

Пример

// Easy to use 
context.BulkSaveChanges(); 

// Easy to customize 
context.BulkSaveChanges(bulk => bulk.BatchSize = 100); 

// Perform Bulk Operations 
context.BulkDelete(customers); 
context.BulkInsert(customers); 
context.BulkUpdate(customers); 

// Customize Primary Key 
context.BulkMerge(customers, operation => { 
    operation.ColumnPrimaryKeyExpression = 
     customer => customer.Code; 
}); 
+0

Благодарим вас за этот ответ. Он может решить проблему с Entity Framework, но решение от CodingYoshi проще реализовать в моем случае. – BitEater

Смежные вопросы