删除大量记录需要花费很长时间

OSH*_*OSH 14 c# linq database optimization sql-server-2012-express

我有一个包含约60,000行的数据库表(在SQL Server 2012 Express上运行).

我使用以下代码清除旧行:

//Deleting CPU measurements older than (oldestAllowedTime)
var allCpuMeasurementsQuery = from curr in msdc.CpuMeasurements where 
    curr.Timestamp < oldestAllowedTime select curr;
foreach (var cpuMeasurement in allCpuMeasurementsQuery)
{
  msdc.CpuMeasurements.Remove(cpuMeasurement);
}
Run Code Online (Sandbox Code Playgroud)

当删除的行数很大(删除表中约90%或更多的记录)时,操作需要特别长的时间.在相对较强的机器(Intel I5台式机)上完成此操作大约需要30分钟.

  1. 这看起来像一个正常的行为吗?

  2. 关于我可以做些什么来减少操作时间的任何想法?

谢谢,

Mag*_*nus 18

实体框架不是很擅长处理这样的批量操作.在这种情况下,您应该使用ExecuteStoreCommand直接针对数据源执行SQL.

var deleteOld = "DELETE FROM CpuMeasurements WHERE curr.Timestamp < {0}";
msdc.ExecuteStoreCommand(deleteOld, oldestAllowedTime);
Run Code Online (Sandbox Code Playgroud)

通过这样做,您不需要将实体加载到内存中(只是为了删除它们)并向数据库发出数千个删除命令.

  • 我很欣赏这里的所有建议.我现在选择这个解决方案,因为它似乎是最简单的(至少对我来说).我认为这里提到的其他解决方案看起来很有前途(EntityFramework.Extended),当事情平静下来时我会检查它们. (2认同)

mat*_*mmo 13

您应该看一下EntityFramework.Extended它是为了帮助批量删除和更新而创建的.

使用它,你可以简单地做:

msdc.CpuMeasurements.Delete(curr => curr.Timestamp < oldestAllowedTime);
Run Code Online (Sandbox Code Playgroud)


Ken*_*eth 5

原因是您为每条记录执行数据库更新.您需要进行批量更新.

EntityFramework.extended 可以处理这种情况.