我必须清理数据库(少数具有给定条件的表,其中条件列始终相同)例如
delete from table1 where date < given_date1 and id = given_id
delete from table2 where date < given_date2 and id = given_id
其中给定的 ID 和给定的日期关系在表与表之间以及 ID 与 ID 之间都有所不同。
实际的删除条件并不总是 where date <给定日期 ,我只是举个例子,假设一个id有300天的数据,另一个有500天的数据,where条件允许删除oldes 10天数据的数量,其中 10 是一个变量,基于用户输入,因此在一次迭代中,所有节点都会通过删除最旧 10 天的数据进行处理,从而查询每个 id 的更改,但事实是它将位于同一组表
之前该脚本是用 sql 脚本编写的并执行其操作,但需要时间,现在我已经实现了一个多线程 java 应用程序,其中新代码如下
for(i=0; i < idcount ; i++)
{
//launch new thread and against that thread call
delete(date,currentid);
}
function delete(date,id)
{
delete from table1 where date < given_date and id = given_id
delete from table2 where date < given_date and id = given_id
}
在实现这个之后,我发现sql表上出现死锁,这是通过索引表解决的,但它仍然没有想象中那么快,如果我有500个线程,它们都会一个接一个地启动,并且显然运行在同一套表。并且 sql 实际上并未在每个表上并行执行?
当我监视 java.exe 和 sqlserver.exe 时,它根本不忙?我希望它应该是这样。
谁能告诉我在同一组表上实现多线程删除的最佳方法是什么,以便我可以提高线程并并行执行删除并消耗可用资源
最佳答案
如果所有操作都在给定 id 上删除,我只需对每个表执行一次删除操作,同时执行所有 id。
例如
delete from table1 where date < given_date and id in (given_id1, given_id2 ..... )
如果有很多给定的_id,首先将它们插入临时表,然后通过连接表以与临时表进行删除来执行每个删除
此外,如果尝试使用多个线程,那么只有在线程中对表进行操作时才可以真正实现改进,这样数据库中就不会出现争用。
关于Java多线程删除同组表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11531031/