我有个问题.这些方法在哪里?
Dialect.supportsTemporaryTables();
Dialect.generateTemporaryTableName();
Dialect.dropTemporaryTableAfterUse();
Dialect.getDropTemporaryTableString();
Run Code Online (Sandbox Code Playgroud)
我试图浏览git历史记录Dialect.java,但没有运气.我发现有类似的东西
MultiTableBulkIdStrategy被创建但我找不到任何如何使用它的例子.
到目前为止......我有遗留代码(使用hibernate 4.3.11),它使用临时表从多个表中进行批量删除.在那些表格中可能有1000行,但也可能有10万行.所以只是为了确保我不会用一些疯狂的删除来杀死数据库我创建临时表,我把(使用具有某些条件的选择查询)一次1000个ID然后使用此临时表从4个表中删除数据.它在while循环中运行,直到基于某些条件的所有数据都没有被删除.交易在每个周期后提交.
为了使它更复杂,这段代码必须运行在:mysql,mariadb,oracle,postgresql,sqlserver和h2之上.
它是使用本机SQL完成的,具有上述方法.但不是我找不到如何重构它的方法.
我的第一次尝试是使用嵌套选择创建查询,如下所示:
delete from TABLE where id in (select id from TABLE where CONDITION limit 1000)但这种方式较慢,因为我必须为每次删除多次运行select查询,而limit在HQL中嵌套选择不支持.
任何想法或指针?
谢谢.
我正在使用这个库来批量执行批量删除,如下所示:
while (castedEndedItems.Any())
{
var subList = castedEndedItems.Take(4000).ToList();
DBRetry.Do(() => EFBatchOperation.For(ctx, ctx.SearchedUserItems).Where(r => subList.Any(a => a == r.ItemID)).Delete(), TimeSpan.FromSeconds(2));
castedEndedItems.RemoveRange(0, subList.Count);
Console.WriteLine("Completed a batch of ended items");
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我一次删除了一批 4000 个项目,并将它们作为参数传递给查询...
我正在使用这个库来执行批量删除:
https://github.com/MikaelEliasson/EntityFramework.Utilities
Run Code Online (Sandbox Code Playgroud)
然而,这样的性能绝对是糟糕的......我测试了几次应用程序并删除了 80000 条记录,例如需要 40 分钟!?
我应该注意,我要删除的参数 (ItemID) 是 varchar(400) 类型,并且出于性能原因对其进行了索引....
是否有任何其他库可以使用或调整此查询以使其工作得更快,因为目前的性能绝对糟糕..:/
我需要使用 pymongo 对 mongodb 进行批量删除。我通过查询获取了需要删除的文档的 _id 字段,但我无法弄清楚如何使用 _id 来删除 10,000 个块。
bulk-delete ×3
bulk ×2
asp.net ×1
asp.net-mvc ×1
c# ×1
hibernate ×1
java ×1
mongodb ×1
pymongo ×1
python ×1
spring ×1
temp-tables ×1