我有两张桌子。我们称它们为 KEY 和 VALUE。
KEY 很小,大约有 1.000.000 条记录。
价值是巨大的,比如 1.000.000.000 条记录。
它们之间存在连接,因此每个 KEY 可能有许多 VALUES。它不是外键,但基本上是相同的含义。
DDL 看起来像这样
create table KEY (
key_id int,
primary key (key_id)
);
create table VALUE (
key_id int,
value_id int,
primary key (key_id, value_id)
);
现在,我的问题。VALUE 中大约一半的 key_id 已从 KEY 中删除,我需要在两个表仍处于高负载状态时有序地删除它们。
这很容易做到
delete v
from VALUE v
left join KEY k using (key_id)
where k.key_id is null;
但是,由于不允许limit
在多表上删除,我不喜欢这种方法。这样的删除需要几个小时才能运行,因此无法限制删除。
另一种方法是创建游标来查找所有丢失的key_id,并有限制地将它们一个一个删除。这似乎很慢,有点倒退。
还有其他选择吗?一些可以提供帮助的好技巧?