Временная таблица для удаления - PullRequest
0 голосов
/ 03 июня 2019

Я должен использовать анонимный блок PL_SQL для удаления строк во многих таблицах.Каждая таблица связана с основной таблицей «TABLE1», и я не могу добавить CASCADE DELETE.Я должен сделать что-то вроде

DELETE FROM table2 WHERE foreign_key in (SELECT ID FROM table1 WHERE ...).
DELETE FROM table3 WHERE foreign_key in (SELECT ID FROM table1 WHERE ...).
...

Запрос «SELECT ID ..» может занять несколько минут, имеет ли смысл поместить все идентификаторы во временную таблицу или что-то в этом роде?Таким образом, я могу выполнить запрос «выбор» только один раз.Есть альтернативы?

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Другим способом является использование PL/SQL-Collections:

DECLARE
  id_list SYS.ODCINUMBERLIST;
BEGIN
  SELECT ID 
    BULK COLLECT INTO id_list
    FROM table1 
   WHERE ...

  FORALL i IN id_list.FIRST..id_list.LAST
    DELETE FROM table2
    WHERE foreign_key = id_list(i);

  FORALL i IN id_list.FIRST..id_list.LAST
    DELETE FROM table3
    WHERE foreign_key = id_list(i);

  ...
END;
0 голосов
/ 03 июня 2019

Если

select id from table1 where ....

занимает много времени, затем зависит . Результат, вероятно, будет кэширован, поэтому следующее выполнение (при удалении из table3) не будет длиться так долго.

Не стоит дорого его тестировать. Удалите пару таблиц по старинке , затем создайте «временную» таблицу с помощью CTAS

create table ids as
  select id from table1 where ...

и используйте его в DELETE операторах. Вам даже не нужен индекс, так как вы все равно должны выполнить полное сканирование таблицы.

Тогда выберите лучший вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...