【发布时间】:2016-02-05 07:27:10
【问题描述】:
我需要从包含 900 万条记录的表中删除 10000 条记录。要删除的 ID 将从复杂查询中获取并存储在 Java 集合中。
我有 3 种方法来实现这个
1) 创建一个prepared statement,将10000个语句加入batch并执行。
语句看起来像这样
Delete from <table_name> where id=?;
2) 编写一个“in”查询而不是批量使用“=”。 喜欢
在此之下,10 000 个 ID 可以在 Java 代码中创建为逗号分隔值并添加到查询中。或者,将 10000 个 ID 插入到临时表中,并在子查询中从该表中进行选择。
Delete from <table_name> where id in (<CSV>);
or
Delete from <table_name> where id in (select id from <temp_table>);
表中没有约束和索引。而且我不能添加一个,因为我正在处理现有的表。
第一个选项需要很长时间才能完成。它运行了 15 小时,但仍未完成。
【问题讨论】:
-
您是说该表在
id列上甚至没有主键? -
这听起来很奇怪,但是是的! id 上没有主键 :)
-
具有
id但没有主键的表。这只是可怕的数据库设计。任何查询都无法在这样的表上执行,那有什么意义呢? -
这让我的工作更加努力。但是这些表来自我们不维护的不同数据源。我不能说我没有答案,所以请大家帮忙。
-
如果您可以添加新的数据库对象(但不能更改现有对象),您可以考虑为您的表添加物化视图。与普通视图不同,物化视图甚至可以在基础表中没有索引的列上具有索引。然后,您可以直接删除此视图中的记录,并有一个额外的触发器来删除基础表中的记录。只是一个想法(没试过)