Ускорить вставки LINQ - PullRequest
       21

Ускорить вставки LINQ

16 голосов
/ 25 августа 2009

У меня есть файл 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. Я не видел большой разницы между просто вставками / отправкими и выборами / обновлениями / вставками / отправками.

Мне все еще нужно попробовать пакетную фиксацию, вручную подключившись к базе данных и скомпилированным запросам.

Ответы [ 11 ]

0 голосов
/ 25 августа 2009

Хорошо, вы должны понимать, что linq создает код динамически для всех операций ADO, которые вы выполняете вместо рукописного ввода, так что это всегда будет занимать больше времени, чем ваш ручной код. Это просто простой способ написания кода, но если вы хотите поговорить о производительности, код ADO.NET всегда будет быстрее в зависимости от того, как вы его пишете.

Я не знаю, попытается ли linq повторно использовать свой последний оператор или нет, если это произойдет, то разделение пакета вставки и пакета обновления может немного улучшить производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...