我有一个CSV文件,需要将其插入到SQL Server数据库中。是否有一种方法可以加快LINQ插入的速度?
我创建了一个简单的Repository方法来保存记录:
public void SaveOffer(Offer offer)
{
Offer dbOffer = this.db.Offers.SingleOrDefault (
o => o.offer_id == offer.offer_id);
// add new offer
if (dbOffer == null)
{
this.db.Offers.InsertOnSubmit(offer);
}
//update existing offer
else
{
dbOffer = offer;
}
this.db.SubmitChanges();
}
但是使用这种方法,程序比使用 ADO.NET SQL 插入(新 SqlConnection、新 SqlCommand 用于 select if exists,新 SqlCommand 用于 update/insert)的方式要慢得多。
对于 100k 个 csv 行,它需要大约一个小时,而 ADO.net 的方式只需要1分钟左右。对于 2M csv 行,ADO.net 大约需要20分钟。LINQ 在25分钟内添加了其中的30k行。我的数据库有3个表,在dbml中连接,但其他两个表都是空的。所有测试都是在空表的情况下进行的。
P.S. 我已经尝试使用 SqlBulkCopy,但我需要对 Offer 进行一些转换,然后才能将其插入到数据库中,我认为这违背了 SqlBulkCopy 的目的。
更新/编辑: 18小时后,LINQ 版本仅添加了约200K行。
我还尝试过仅使用 LINQ 插入进行导入,但与 ADO.net 相比也非常慢。我没有看到仅插入/submitchanges 和 select/update/insert/submitchanges之间的巨大差异。
我还需要尝试批量提交、手动连接到数据库和编译查询。
dbOffer = offer;
这一行并不对应于数据库的更新,而仅仅是将本地变量 dbOffer 的引用进行更新 - 而这个变量之后再也没有被使用过... - Eamon Nerbonne