我正在使用Java和mybatis。
我有一个这样的查询,我需要在key_b上对2000个值执行这个查询。这意味着我需要运行sql 2000次。这相当慢。
DELETE FROM my_table
WHERE key_a = xxx
AND key_b = yyy现在我想出了另一个解决方案,这一次我在key_b的IN子句中发送了1000个值。这意味着我只执行了两个查询。我希望这一次至少能更快。但这似乎比上面的更慢。下面是sql语句。
DELETE FROM my_table
WHERE key_a = xxxx
AND key_b IN (y1, y2, ... y1000)有关详细信息,key_b是主键。key_a是一个外键,并且有一个索引。
另一件事是,我尝试在所有sql执行完之后取出会话并提交。但它并没有得到很大的改善。
发布于 2017-02-20 21:00:14
您可以使用临时表来执行以下操作:
我的意思是,如果你有一个包含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
);发布于 2017-02-20 21:20:03
我建议坚持使用第一种方法:在id集合上的Java循环中调用准备好的Delete语句。与ExecutorType重用或批处理背道而驰,因此该语句只准备一次,并为每条记录运行。此外,我不鼓励尝试绑定数千个参数。
无论如何,我担心这是您能做的最好的事情,因为删除操作将检查完整性约束,可能会更新每条记录的索引。这不是“膨胀”。
https://stackoverflow.com/questions/42345154
复制相似问题