У меня есть файл 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-строках это занимает около часа против 1 минуты или около того для пути ADO.net. Для строк 2M csv требуется ADO.net около 20 минут. LINQ добавил около 30 тыс. Из этих 2М строк за 25 минут. В моей базе данных есть 3 таблицы, связанные в dbml, но две другие таблицы пусты. Тесты были выполнены со всеми пустыми таблицами.
P.S. Я пытался использовать SqlBulkCopy, но мне нужно сделать некоторые преобразования в предложении, прежде чем вставлять их в db, и я думаю, что это побеждает цель SqlBulkCopy.
Обновление/редактирование: После 18 часов версия LINQ добавила всего ~ 200 тыс. Строк.
Я тестировал импорт только с вставками LINQ, а также очень медленно по сравнению с ADO.net. Я не видел большой разницы между только вставками/подписями и выборами/обновлениями/вставками/подчинениями.
Мне еще нужно попробовать пакетное коммит, вручную подключившись к db и скомпилированным запросам.