无法改进批量删除

时间:2017-02-20 12:55:39

标签: oracle

我正在使用Java和mybatis。

我有这样的查询,我需要在key_b上为2000个值执行此操作。这意味着我需要运行sql 2000次。这是相当慢的。

DELETE FROM my_table
WHERE key_a = xxx
AND key_b = yyy

现在我想出了另一个解决方案,这次我在IN key_b条款中发送了1000个值。这意味着我只执行两个查询。我期待这个至少更快。但这似乎比上面的更慢。这是sql。

DELETE FROM my_table
WHERE key_a = xxxx
AND key_b IN (y1, y2, ... y1000)

有关更多信息,key_b是主键。 key_a是一个外键,有一个索引。

另一件事,我已经尝试取出会话并在所有sqls执行后进行提交。但它没有那么大的改善。

2 个答案:

答案 0 :(得分:0)

您可以使用临时表:

我的意思是如果你有一个有id列的表。

然后您可以将值插入该表:

insert into temp_table

select 1 from dual -- your ids 

union all

select 2 from dual 

union all

select 3 from dual

union all

......

填写temp_table后,你可以运行:

DELETE FROM my_table
WHERE key_a = xxxx
AND key_b IN
(
select id from temp_table
);

答案 1 :(得分:0)

我建议坚持第一种方法:在id集合的Java循环中调用准备好的Delete语句。当然,使用ExecutorType REUSE或BATCH,以便为每条记录准备一次并运行该语句。 此外,我不鼓励尝试绑定数千个参数。

无论如何,我担心这是你能做的最好的事情,因为Delete操作会检查每条记录的完整性约束,可能是更新索引。那不是"批量"。