Могу ли я сделать очень большую вставку с Linq-to-SQL? - PullRequest
2 голосов
/ 02 марта 2011

У меня есть некоторые текстовые данные, которые я загружаю в базу данных SQL Server 2005, используя Linq-to-SQL, используя этот метод (псевдо-код):

Create a DataContext

While (new data exists)
{
    Read a record from the text file

    Create a new Record 

    Populate the record

    dataContext.InsertOnSubmit(record);
}

dataContext.SubmitChanges();

Код представляет собой небольшое консольное приложение C #. Пока это работает нормально, но я собираюсь выполнить импорт реальных данных (а не тестового подмножества), и он содержит около 2 миллионов строк вместо 1000, которые я тестировал. Нужно ли мне делать какие-то умные пакетные операции или что-то подобное, чтобы избежать неудачного или неуместного выполнения кода, или Linq-to-SQL должен обрабатывать это изящно?

Ответы [ 4 ]

7 голосов
/ 02 марта 2011

Похоже, что это будет работать, однако изменения (и, следовательно, память), которые хранятся в DataContext, будут расти с каждым InsertOnSubmit.Может быть, целесообразно выполнять SubmitChanges каждые 100 записей?

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

5 голосов
/ 02 марта 2011

Если вам нужно сделать массовые вставки, вы должны проверить SqlBulkCopy

Linq-to-SQL не очень подходит для крупномасштабных массовых вставок.

3 голосов
/ 02 марта 2011

Вы хотели бы вызывать SubmitChanges () каждые 1000 записей или около того, чтобы сбросить изменения до сих пор, иначе у вас не хватит памяти.

Если вам нужна производительность, вы можете обойти Linq-To-SQL и вместо этого перейти к System.Data.SqlClient.SqlBulkCopy.

1 голос
/ 02 марта 2011

Просто для записи я сделал как marc_s, и Питер предложил и разбил данные на части.Это не особенно быстро (потребовалось около полутора часов на настройку отладки, с подключенным отладчиком и довольно большим выводом информации о ходе работы консоли), но оно вполне соответствует нашим потребностям:

Create a DataContext

numRows = 0;
While (new data exists)
{
    Read a record from the text file

    Create a new Record 

    Populate the record

    dataContext.InsertOnSubmit(record)

    // Submit the changes in thousand row batches
    if (numRows % 1000 == 999)
        dataContext.SubmitChanges()

    numRows++
}

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