【发布时间】:2012-07-17 21:19:14
【问题描述】:
我必须清理数据库(几个表具有给定的条件,其中条件的列总是相同的)例如
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 上各不相同。
实际的删除条件并不总是 where date
之前该脚本被编写为 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 时,它一点也不忙?我希望它应该是。
谁能告诉我在同一组表上实现多线程删除的最佳方法是什么,以便我可以启动线程并并行执行删除并消耗可用资源
【问题讨论】:
-
你说的“不如预期的快”是什么意思? java 和 sqlserver 进程可能都在等待 IO。
-
+1 到@vainolo。此外,您有一个磁盘设备。无论有多少线程在冲击您的 SQL 服务器,您都将受到磁盘 IO 的约束。
DELETE ... IN是正确的解决方案。 -
我的意思是当我运行 sql 脚本来清除表时,我有 4000 个 id,比如 20 个表,这 4000 个 id 和 20 个表在 7 小时内被清除(还有更多表 20 仅用于例如,但是是的,在 7 小时内完成),现在当多线程 java 程序运行时,我希望这会在一个小时或更早的时间内完成(因为它有 500 个线程),或者我期待错了吗? Sql server 事务日志已关闭。
-
嗨 Gray,实际的删除条件并不总是 where date
标签: java sql-server multithreading sql-delete