我有一个项目,偶尔需要从六个不同大小的表中删除数万行数据,总共这些表大约有3000万行数据。由于我得到的数据结构,我不知道哪个表包含需要被删除的行,因此必须对所有表运行所有删除操作。我已经针对ID列建立了索引以尝试加快速度,但如果可以提高速度,则可以删除它。
我的问题是,我似乎找不到一种有效的方法来执行删除操作。为了进行测试,我在Oracle SQL Developer中针对具有约9400行的单个测试表运行了7384个独立的
我的问题是,我似乎找不到一种有效的方法来执行删除操作。为了进行测试,我在Oracle SQL Developer中针对具有约9400行的单个测试表运行了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...
在WHERE
语句中有7384个OR
逻辑运算符的SELECT
查询花费了127.4秒:
select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ...
在where语句中有7384个OR条件的DELETE from (SELECT)
语句执行了74.4秒:
delete from (select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ...)
虽然最后一个方法可能是最快的,但在进一步测试时,即使从9000行表扩展到仅200,000行表(仍然不到最终表格集大小的1%),相同的语句运行需要14分钟。虽然每行要快50%以上,但当针对完整数据集运行时,大约需要一天时间。有可靠消息称,我们用来执行此任务的软件可以在约20分钟内完成。
所以我的问题是:
- 是否有更好的删除方法?
- 我应该使用一轮
SELECT
语句(例如第二个测试)发现任何给定行所在的表,然后发送删除查询吗?即使如此看起来也很慢,但...- 我还能做些什么来加速删除吗?我没有DBA级别的访问权限或知识。
delete from TABLE1 where ID in (1000001356443294,1000001356443296,...)
- CapelliCORA-01795: 列表中的表达式数量已达到最大值1000
(仅在此测试查询中就有超过7000个)。 - GIS-Jonathan