【发布时间】: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 列上有索引吗?
标签: c# database linq optimization sql-server-2012-express