与遗留SQL Insert语句相比,LINQ Insertons提交速度非常慢

时间:2011-01-27 14:01:21

标签: linq-to-sql submitchanges performance

我有一个很大的插入作业,比如300000个插页。

如果我以遗留方式执行此操作,我只需编写一个包含100个Insert语句块的SQL字符串,并对DB执行executeCommand(每100条记录)。

每3秒左右就会有大约100次插入。

现在当然在插入的值中存在单引号和CrLf的问题。因此,不是编写代码来加倍单引号等等,因为我很懒,我有一个Linq InsertOnSubmit和一个context.SublitChanges彼此100行。

这比传统方式多出20倍!!!

为什么?

2 个答案:

答案 0 :(得分:4)

您没有使用正确的工具来完成这项工作。 LINQ-to-SQL和大多数其他ORM(至少是Entity Framework和NHibernate)适用于OLTP场景,它们不适用于批量数据操作,并且在用于批量数据操作时执行速度很慢。

您应该使用SqlBulkCopy

答案 1 :(得分:1)

我遇到了同样的问题,InsertOnSubmit()需要很长时间。

但是,使用DataTableHelper类(可从下面的链接下载),只更改代码的1或2行,您可以轻松使用批量插入。

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

希望这有帮助。