我有一个很大的插入作业,比如300000个插页。
如果我以遗留方式执行此操作,我只需编写一个包含100个Insert语句块的SQL字符串,并对DB执行executeCommand(每100条记录)。
每3秒左右就会有大约100次插入。
现在当然在插入的值中存在单引号和CrLf的问题。因此,不是编写代码来加倍单引号等等,因为我很懒,我有一个Linq InsertOnSubmit和一个context.SublitChanges彼此100行。
这比传统方式多出20倍!!!
为什么?
答案 0 :(得分:4)
您没有使用正确的工具来完成这项工作。 LINQ-to-SQL和大多数其他ORM(至少是Entity Framework和NHibernate)适用于OLTP场景,它们不适用于批量数据操作,并且在用于批量数据操作时执行速度很慢。
您应该使用SqlBulkCopy
。
答案 1 :(得分:1)
我遇到了同样的问题,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);
}
希望这有帮助。