相关疑难解决方法(0)

实体框架中最快的插入方式

我正在寻找插入Entity Framework的最快方法.

我问这个是因为你有一个活跃的TransactionScope并且插入很大(4000+).它可能持续超过10分钟(事务的默认超时),这将导致事务不完整.

c# sql entity-framework

640
推荐指数
17
解决办法
38万
查看次数

与ObjectContext相比,为什么在EF 4.1中插入实体的速度如此之慢?

基本上,我在一个事务中插入35000个对象:

using(var uow = new MyContext()){
  for(int i = 1; i < 35000; i++) {
     var o = new MyObject()...;
     uow.MySet.Add(o);
  }
  uow.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

这需要永远!如果我使用底层ObjectContext(通过使用IObjectAdapter),它仍然很慢但需要大约20秒.它似乎DbSet<>正在进行一些线性搜索,这需要花费大量时间......

其他人看到这个问题?

c# entity-framework entity-framework-4.1

79
推荐指数
3
解决办法
3万
查看次数

在单个事务中针对不同表进行多个并行(异步)SqlBulkCopy 插入的性能

长话短说

为什么async在单个事务上针对不相关的表并行运行多个 SqlBulkCopy 插入看起来就像串行运行一样?


语境

我有一些代码正在计算和存储大量数据。计算是预先完成的,因此代码的存储部分得到了要存储的一大堆数据。

我的数据库写入正在完成,SqlBulkCopy.WriteToServerAsync一般来说,它可以很好地完成工作。

我需要存储6个与业务相关的表,但与SQL无关。因此,我对它们的写入需要在一个事务中进行,以便任何一个写入上的错误都会恢复所有其他写入上的写入。

该代码的性能相当关键,因此我希望能够并行运行 BulkInsert。没有 FKey 或任何其他与之交互的表(数据完整性由代码管理),因此我看不出有任何理由认为这是不可能的。


我目前写的内容

我以为我知道如何编写所有代码并且能够使其全部正常工作,但是有一个我不明白的奇怪的性能下降:

很高兴提供您想要的实际代码位,但这已经是一个很长的 Q,并且代码会很长到 0。如果你确实想看什么,LMK。

我可以写:

  • “按顺序批量插入到每个表中,全部在单个事务中”。

    • 即我打开一个new SqlConnection()and .BeginTransaction(),
    • 然后我foreach翻了6张桌子,await InsertToTable(transaction)每张桌子都移动foreach到下一张桌子。
    • foreach结束时我.Commit()进行事务并关闭连接。
    • 我有一个大容量测试,该版本在184秒内运行(95%,+/- 2.45 秒)。
  • “按顺序批量插入每个表,每个表都有一个新的连接和事务。”

    • 即我foreach遍历了 6 个表,并且await InsertToTable()每个表在foreach移动到下一个表之前。
    • 在每次InsertToTable()调用中,我都会打开一个新的SqlConnectionand BeginTransaction,然后在从方法返回之前打开.Commit()一个 and 。.Close()
    • 我有一个大容量测试,该版本在185 …

c# sql-server sqlbulkcopy task-parallel-library async-await

3
推荐指数
1
解决办法
2099
查看次数