LINQ Insertonsubmit очень медленный по сравнению с устаревшим оператором SQL Insert - PullRequest
1 голос
/ 27 января 2011

У меня большая работа по вставке, скажем, 300000 вставок.

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

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

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

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

Почему?

Ответы [ 2 ]

4 голосов
/ 27 января 2011

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

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

1 голос
/ 01 июля 2015

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

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

Bulk-inserts

Например:

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);
}

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

...