C# 使用 SQLBulkCopy 或等效库高效地批量删除 50000 条记录

标签 c# asp.net asp.net-mvc bulk bulk-delete

我正在使用这个库来批量执行批量删除,如下所示:

  while (castedEndedItems.Any())
  {
    var subList = castedEndedItems.Take(4000).ToList();
    DBRetry.Do(() => EFBatchOperation.For(ctx, ctx.SearchedUserItems).Where(r => subList.Any(a => a == r.ItemID)).Delete(), TimeSpan.FromSeconds(2));
    castedEndedItems.RemoveRange(0, subList.Count);
    Console.WriteLine("Completed a batch of ended items");
  }

你们可以看到,我一次删除了一批 4000 个项目,并将它们作为参数传递给查询...

我正在使用这个库来执行批量删除:

https://github.com/MikaelEliasson/EntityFramework.Utilities

然而,这样的性能绝对是糟糕的......我测试了应用程序几次并删除了 80000 条记录,例如,它实际上需要 40 分钟!?

我应该注意,我要删除的参数 (ItemID) 是 varchar(400) 类型,并且出于性能原因对其进行了索引....

是否有任何其他库可以使用或调整此查询以使其更快地工作,因为目前的性能绝对糟糕.. :/

最佳答案

如果您准备使用存储过程,那么您可以在没有任何外部库的情况下执行此操作:

  • 使用表值参数 @ids 创建存储过程
  • 为该表值参数定义一个 SQL 类型(只是一个 id 列,假设一个简单的 PK)
  • 在存储过程中使用

    delete from table where id in (select id from @ids);
    
  • 在您的应用程序中创建一个 DataTable 并填充以匹配 SQL 表

  • 调用存储过程时将数据表作为命令参数传递。

This answer说明了这个过程。

任何其他选项都需要做与此等效的事情——或者效率较低的事情。

关于C# 使用 SQLBulkCopy 或等效库高效地批量删除 50000 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54403944/

相关文章:

c# - 为什么调整 png 图像的大小会失去透明度?

c# - 通过 View 上的按钮运行方法(ASP.NET MVC)

c# - 我的数据库系统找不到 asp.net 中指定的文件

c# - 范围类未在 Google Drive API 中解析

asp.net-mvc - 默认操作的可选 ID

c# - 来自 C# 代码的 Javascript 仅在 Google Chrome 中刷新

c# - 在 ASP.NET 中使用 Thread.Sleep(int) 是否明智,还是我应该使用其他方法?

c# - 为什么在 ModelState.IsValid 检查之前更新模型时 ModelState 会报错?

asp.net - .resx vs 数据库 vs 提供本地化/全局化的自定义解决方案

.net - 覆盖 AuthorizeAttribute.AuthorizeCore 时为 "cannot set status after HTTP headers"