2

我有一个大的插入工作要执行,比如 300000 个插入。

如果我以传统方式执行此操作,我只需编写一个包含 100 个插入语句块的 SQL 字符串,并对数据库执行一个 executeCommand(每 100 条记录)。

这意味着每 3 秒左右可以插入大约 100 次。

现在,插入的值中当然存在单引号和 CrLf 的问题。因此,与其编写代码将单引号加倍等等,因为我很懒,所以我尝试使用 Linq InsertOnSubmit 和一个 context.SublitChanges 彼此 100 行。

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

为什么?

4

2 回答 2

4

你没有使用正确的工具来完成这项工作。LINQ-to-SQL 和大多数其他 ORM(至少是实体框架和 NHibernate)适用于 OLTP 场景,它们不适用于大容量数据操作,并且在用于大容量数据操作时执行缓慢。

你应该使用SqlBulkCopy.

于 2011-01-27T14:12:38.860 回答
2

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

但是,使用DataTableHelper该类(可从下面的链接下载)并仅更改 1 或 2 行代码,您可以轻松地使用 Bulk Insert 代替。

批量插入

例如:

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

希望这可以帮助。

于 2015-07-01T10:33:43.477 回答