我不得不清理数据库(几个具有给定条件的表,其中条件的列总是相同的)例如。
delete from table1 where date < given_date1 and id = given_id
delete from table2 where date < given_date2 and id = given_id
其中given_id和givendate关系在表格和id上都有所不同。
实际删除条件并不总是日期&lt; givendate,我刚才写的,所以说一个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时,它根本不忙吗?我希望它应该是。
有谁能告诉我在同一组表上实现多线程删除的最佳方法是什么,这样我就可以提升线程并并行删除并消耗可用资源
答案 0 :(得分:2)
如果对给定的id删除了所有操作,我只会在每个表上删除一次所有ID。
e.g。
delete from table1 where date < given_date and id in (given_id1, given_id2 ..... )
如果有很多given_ids,则首先将它们插入临时表中,然后通过连接表来执行每次删除以删除临时表
此外,如果尝试使用多个线程,那么只有在线程中的表上执行操作才能实现改进,因此数据库中不存在争用。
答案 1 :(得分:1)
忽略您创建的问题......
为什么不使用IN
声明?
delete from table1 where date < given_date and id IN (id1, id2, id3, ...)
根据说明进行更新:
根据评论中的解释,我的猜测是你没有好的索引,每个delete
语句都会导致表扫描。每个表扫描锁定表,因此数据库一次只能处理一个语句。将date
和id
列以及where
语句的delete
子句中使用的任何其他列编入索引。
答案 2 :(得分:0)
根据我的个人经验,我创建了一个类来管理我的查询和与数据库的通信。我使用线程池来管理我的线程,只是让线程调用我的静态数据库管理器。管理器应该有一个同步方法,它在数据库连接上获取lock()
。然后,线程将能够访问数据库,并且它们的操作不会相互冲突。
答案 3 :(得分:0)
如果你不关心在一个事务单元中创建所有命令,那么将删除放在它自己的事务中(小的)。