У меня есть проект, который иногда должен удалять несколько десятков тысяч строк из одной из шести таблиц разного размера, но между ними есть около 30 миллионов строк. Из-за структуры данных, которые мне были предоставлены, я не знаю, какая из шести таблиц содержит строку, которая должна быть удалена в ней, поэтому я должен запускать все удаления по всем таблицам. Я построил индекс INDEX против столбца ID, чтобы попытаться ускорить процесс, но его можно удалить, если это ускорит процесс.
Моя проблема в том, что я не могу найти эффективный способ фактического выполнения удаления. Для целей тестирования я запускаю 7384 удалять строки по одной тестовой таблице, содержащей около 9400 строк. Я тестировал ряд возможных решений для запросов в 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
, который содержит предложения 7384 OR
, в которых принимал 127.4s:
select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ...
1 DELETE from (SELECT)
, в котором содержится 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.