我有一个包含几百万个条目的MSSQL数据库表。 每个新条目都从最后一个条目获得ID +1。这意味着较低的ID号是较旧的条目。现在我想借助它的ID删除数据库中的旧条目。 我删除了低于“maxID”的每个“条目”。
while (true)
{
List<Entry> entries = entity.Entry.Where(z => z.id < maxID).Take(1000).ToList();
foreach (var entry in entries)
{
entity.Entry.DeleteObject(entry);
}
if (entries < 1000)
{
break;
}
}
我无法使用一个查询获取所有条目,因为这会引发System.OutOfMemoryException。所以我只拿了1000个条目并重复删除功能,直到删除每个条目。
我的问题是:“.Take()”在性能方面的最佳参赛人数是多少?
答案 0 :(得分:1)
删除并重新创建数据库中的表会更快, 您可以使用调用存储过程直接对数据库执行命令 ExecuteStoreQuery方法。
实体框架自动生成的任何命令可能比数据库开发人员显式编写的类似命令更复杂。如果需要显式控制针对数据源执行的命令,请考虑定义到表值函数或存储过程的映射。 - MSDN
因为我可以看到你的代码(如果我错了或请改进答案请纠正我),你的代码实际上是在内存中加载实体,这是一个开销成本,因为你需要执行删除操作,你的查询将创建删除查询标记的每个实体
DeleteObject
。因此,就性能而言,最好调用存储过程并直接对数据库执行查询。
答案 1 :(得分:0)
试试这个......
entity.Entry.Where(z => z.id < maxID).ToList().ForEach(entity.Entry.DeleteObject);
entity.SaveChanges();