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

时间:2013-05-08 13:41:14

标签: c# database linq 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);
}

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

  1. 这看起来像是一种正常行为吗?

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

  3. 谢谢,

4 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:13)

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

使用它,你可以做到:

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:-1)

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

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