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

本文关键字:长时间 记录 删除 | 更新日期: 2023-09-27 18:12:44

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

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

//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);
}

当删除的行数很大(约90%或更多的表中的记录正在被删除)时,操作花费的时间非常长。在性能相对较强的机器(Intel I5台式机)上完成此操作大约需要30分钟。

  1. 这看起来是正常的行为吗?

  2. 有什么办法可以缩短手术时间吗?

谢谢,

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

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

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

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

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

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

msdc.CpuMeasurements.Delete(curr => curr.Timestamp < oldestAllowedTime);

这样做的原因是您对每条记录执行一次DB更新。你需要批量更新

EntityFramework.extended可以处理这个场景

删除大量数据可能需要很长时间。

您可能必须将sql移出应用程序,并通过sql Server代理将其作为单个sql脚本运行。例如,它可以在最安静的时候每天运行一次。