LINQ Insertonsubmit очень медленный по сравнению с устаревшей инструкцией SQL Insert

Мне нужно выполнить большую работу по вставке, скажем, 300000 вставок.

Если я сделаю это устаревшим способом, я просто пишу строку SQL с блоками из 100 операторов Insert и выполняю команду executeCommand для БД (каждые 100 записей).

Это дает около 100 вставок за 3 секунды или около того.

Теперь, конечно, есть проблема с одинарными кавычками и CrLf внутри вставленных значений. Поэтому вместо того, чтобы писать код для удвоения одинарных кавычек и т. д., поскольку я ленив, я использую Linq InsertOnSubmit и один контекст. SublitChanges друг друга 100 строк.

И это занимает в 20 раз больше времени, чем устаревший способ!!!

Почему?


person Didier Levy    schedule 27.01.2011    source источник
comment
Вы запускали трассировку SQL для сравнения двух методов? Мне было бы любопытно увидеть что-нибудь из реальных вставок.   -  person schellack    schedule 27.01.2011
comment
Linq-to-SQL не разработан и предназначен для массовых операций — используйте классический прямой способ SQL (например, SqlBulkCopy и т. д.) для таких ситуаций.   -  person marc_s    schedule 27.01.2011


Ответы (2)


Вы используете не тот инструмент для работы. LINQ-to-SQL и большинство других ORM (по крайней мере, Entity Framework и NHibernate) предназначены для сценариев OLTP, они не предназначены для операций с массовыми данными и будут работать медленно при использовании для операций с массовыми данными.

Вы должны использовать SqlBulkCopy.

person jason    schedule 27.01.2011

У меня были те же проблемы, но InsertOnSubmit() занимало много времени.

Однако, используя класс DataTableHelper (который можно загрузить по ссылке ниже) и изменив всего 1 или 2 строки вашего кода, вы можете легко использовать массовую вставку.

Массовые вставки

Например:

const int RECORDS_TO_INSERT = 5000;

List<Product> recordsToBeInserted = new List<Product>();
using (NorthwindDataContext dc = new NorthwindDataContext())
{
    for (int n = 0; n < RECORDS_TO_INSERT; n++)
    {
        Product newProduct = new Product()
        {
            ProductName = "Product " + n.ToString(),
            UnitPrice = 3999,
            UnitsInStock = 2,
            UnitsOnOrder = 0,
            Discontinued = false
        };
        recordsToBeInserted.Add(newProduct);
    }
    // Insert this List<> of records into the [Products] table in our database, using a Bulk Insert
    DataTableHelper.BulkCopyToDatabase(recordsToBeInserted, "Products", dc);
}

Надеюсь это поможет.

person Mike Gledhill    schedule 01.07.2015
comment
Ссылка Bulk-inserts не работает. - person jk7; 29.10.2020