我有一个项目需要偶尔从六个不同大小的表之一中删除数万行,但它们之间有大约 3000 万行。由于我获得的数据结构,我不知道六个表中的哪个表中有需要删除的行,因此我必须对所有表运行所有删除操作。我已经针对 ID 列构建了一个 INDEX 来尝试加快速度,但如果这样可以加快速度,可以将其删除。
我的问题是,我似乎无法找到一种有效的方法来实际执行删除。出于测试的目的,我正在针对大约 9400 行的单个测试表运行 7384 个删除行。我在 Oracle SQL Developer 中测试了许多可能的查询解决方案:
7384 个单独的DELETE
语句耗时203秒:
delete from TABLE1 where ID=1000001356443294;
delete from TABLE1 where ID=1000001356443296;
etc...
7384 个单独的SELECT
语句耗时57秒:
select ID from TABLE1 where ID=1000001356443294
select ID from TABLE1 where ID=1000001356443296
etc...
7384 条单独的DELETE from (SELECT)
语句耗时214秒:
delete from (select ID from TABLE1 where ID=1000001356443294);
delete from (select ID from TABLE1 where ID=1000001356443296);
etc...
1条SELECT
语句在 where 中包含 7384个OR
子句127.4s:
select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ...
1条DELETE from (SELECT)
语句在 where 中包含 7384个OR
子句,时间为74.4s:
delete from (select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ...)
虽然最后一个可能是最快的,但经过进一步测试,当从 9000 行表扩展到甚至只有 200,000 行表(仍然小于最终表集大小的 1%)时,它仍然非常慢,其中相同的语句需要14 分钟才能完成跑。虽然每行速度快了 50% 以上,但在针对完整数据集运行时,这仍然可以推断出大约一天。我有很好的权威,我们用来完成这项任务的软件可以在大约20 分钟内完成。
所以我的问题是:
- 有没有更好的删除方法?
- 我是否应该使用一轮
SELECT
语句(即,像第二个测试)来发现任何给定行在哪个表中,然后执行删除查询?即使这样看起来很慢,但是......- 我还能做些什么来加快删除速度吗?我没有 DBA 级别的访问权限或知识。