我有一个场景,我必须定期删除几十万行(基于服务器决定或一些固定的时间间隔).我正在使用entityframework 6.0并且问题是正常的Remove()方法对于批量操作来说很慢.我在考虑一些可能的情况:
案例1:通过实体框架,使用RemoveRange.
var db = new MyDbContext();
var itemsToDelete = db.TableFoo.Where(x=>!x.new);
db.MyTable.RemoveRange(itemsToDelete);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
我检查过这个比在foreach中单独使用Remove更快.但它仍然发送oracle原子sql而不是批处理.
情况2:通过实体框架调用一些过程或包,它们将对表执行删除操作.虽然在我看来它是最快的选择,但我仍然需要在这里弄清楚什么是最好的删除方式,我知道截断,但它不会在这里起作用.我所知道的是:
CREATE OR REPLACE PROCEDURE deleteDBFoo(p_toc IN DBFOO.TOC%TYPE)
IS
BEGIN
DELETE DBFOO where TOC < "SOME DATE";
COMMIT;
END;
Run Code Online (Sandbox Code Playgroud)
案例3:在oracle中自动执行此任务(不知道这是否可能),大小写标准是从某个修复日期 - 时间间隔中删除所有旧行.
处理此方案的优化方法是什么?如果除了这些案例之外还有其他一些更好的方法,请对此有所了解.
UPDATE1:做了一些分析后,我发现了以下结果:
用于删除数据库中的100万行
Trunc Table耗时3.46秒.案例2:花了37.398秒案例1:花了几分钟.对于我的解决方案,我将使用案例2,但我仍然比案例2更好地等待解决方案或以某种方式改进它.