У меня две таблицы. Назовите их KEY и VALUE.
KEY небольшой, где-то около 1.000.000 записей.
VALUE огромна, скажем, 1.000.000.000 записей.
Между ними существует такое соединение, что каждый КЛЮЧ может иметь много значений. Это не внешний ключ, но в основном тот же смысл.
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)
);
Теперь, моя проблема. Около половины всех key_ids в VALUE были удалены из KEY, и мне нужно удалить их упорядоченным способом, в то время как обе таблицы все еще находятся под большой нагрузкой.
Было бы легко сделать
delete v
from VALUE v
left join KEY k using (key_id)
where k.key_id is null;
Однако, поскольку это не разрешено иметь limit
для удаления нескольких таблиц, мне не нравится этот подход. Такое удаление займет несколько часов, и это делает невозможным дросселирование удалений.
Другим подходом является создание курсора для поиска всех отсутствующих ключей и удаления их один за другим с ограничением. Это кажется очень медленным и отчасти назад.
Есть ли другие варианты? Некоторые интересные трюки, которые могли бы помочь?
Спасибо.