У меня есть файл CSV, и я должен вставить его в базу данных SQL Server. Есть ли способ ускорить вставки LINQ?
Я создал простой метод репозитория для сохранения записи:
public void SaveOffer(Offer offer)
{
Offer dbOffer = this.db.Offers.SingleOrDefault (
o => o.offer_id == offer.offer_id);
// add new offer
if (dbOffer == null)
{
this.db.Offers.InsertOnSubmit(offer);
}
//update existing offer
else
{
dbOffer = offer;
}
this.db.SubmitChanges();
}
Но используя этот метод, программа работает намного медленнее, чем вставка данных с использованием ADO.net SQL вставок (новый SqlConnection, новый SqlCommand для выбора, если существует, новый SqlCommand для обновления / вставки).
В строках 100k csv путь ADO.net занимает около часа против 1 минуты или около того. Для 2M csv строк ADO.net потребовалось около 20 минут. LINQ добавил около 30 тыс. Из этих 2 млн строк за 25 минут. В моей базе данных есть 3 таблицы, связанные в dbml, но две другие таблицы пусты. Тесты проводились с пустыми таблицами.
P.S. Я пытался использовать SqlBulkCopy, но мне нужно сделать некоторые преобразования в Offer, прежде чем вставлять его в базу данных, и я думаю, что это противоречит цели SqlBulkCopy.
Обновление / редактирование:
После 18 часов версия LINQ добавила всего ~ 200 тыс. Строк.
Я тестировал импорт только со вставками LINQ, и он также очень медленный по сравнению с ADO.net. Я не видел большой разницы между просто вставками / отправкими и выборами / обновлениями / вставками / отправками.
Мне все еще нужно попробовать пакетную фиксацию, вручную подключившись к базе данных и скомпилированным запросам.