2

我必须清理数据库(几个具有给定条件的表,其中条件的列总是相同的)例如

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 < givendate ,我只是写了一个例子,所以说一个 id 有 300 天的数据,而另一个 500 天的数据, where 条件允许删除 oldes 10 天的数据 where 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 时,它​​根本不忙吗?我希望它应该是。

谁能告诉我在同一组表上实现多线程删除的最佳方法是什么,这样我就可以启动线程并并行删除并消耗可用资源

4

4 回答 4

2

如果所有操作都在给定 id 上删除,那么我只需对每个表执行一次删除所有 id 即可。

例如

delete from table1 where date < given_date and id in (given_id1, given_id2 ..... )

如果有很多 given_ids,首先将它们插入到临时表中,然后通过将表连接到临时表中来执行每个删除操作

此外,如果尝试使用多个线程,那么只有在您对线程中的表进行操作时才能真正预期改进,因此数据库中不会出现争用。

于 2012-07-17T21:30:16.757 回答
1

忽略您创建的问题...

为什么不使用IN语句?

delete from table1 where date < given_date and id IN (id1, id2, id3, ...)

基于澄清更新: 根据评论中的解释,我的猜测是您没有良好的索引,并且每条delete语句都会导致表扫描。每次表扫描都会锁定表,因此数据库一次只能处理一条语句。索引dateid列以及语句where子句中使用的任何其他列delete

于 2012-07-17T21:28:16.677 回答
0

以我个人的经验,我开设了一个课程来管理我的查询以及与数据库的通信。我使用线程池来管理我的线程,并让线程调用我的静态数据库管理器。管理器中应该有一个同步的方法来获取lock()数据库连接。然后线程将能够访问数据库,并且它们的操作不会相互冲突。

于 2012-07-17T21:25:46.940 回答
0

如果您不关心在一个事务单元中制作所有命令,那么将删除放在它自己的事务中(小一个)。

于 2012-07-17T21:31:19.920 回答