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

Posted

技术标签:

【中文标题】删除大量记录需要很长时间【英文标题】:Deleting a large number of records takes a VERY long time 【发布时间】:2013-05-02 18:41:06 【问题描述】:

我有一个包含约 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 分钟。

    这看起来像是正常行为吗?

    有什么想法可以减少手术时间吗?

谢谢,

【问题讨论】:

看看DeleteAllOnSubmit,可能会有帮助。 AFAIK 你正在做的是对数据库运行 60,000 多个删除命令。如果您可以只运行一个命令,或者成批运行几百个或更少的命令,则不会出现性能问题。 实体框架在这类事情上并不擅长。最好创建一个您在时间戳中传递的存储过程,并以这种方式删除所有记录。 我通常将这些包装在一个事务中。如果这不能改善事情,我会调用一个 SPROC 来完成这项工作,因为这将避免大量的网络流量。 另外,您在 Timestamp 列上有索引吗? 【参考方案1】:

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

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

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

【讨论】:

感谢这里的所有建议。我现在选择这个解决方案,因为它似乎是最简单的(至少对我来说)。我确实认为这里提到的其他解决方案看起来很有希望(EntityFramework.Extended),当事情平静下来时我会检查它们。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于删除大量记录需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 删除重复记录有时需要很长时间

MySql 删除需要很长时间

Linq 更新需要很长时间来处理

回显大量 HTML 数据需要很长时间 PHP

尝试在 UITableView 中加载大量 JSON 数据需要很长时间

迁移需要很长时间才能应用到数据库