Oracle: удаление снизу вверх

#oracle

#Oracle

Вопрос:

Допустим, у меня есть две таблицы:

 create table parent (
  number not null,
  constraint parent_pk primary key(id),
)

create table child (
  id number not null,
  parent_id number not null,
  constraint child_pk primary key(id),
  constraint child_fk1 foreign key(parent_id)
  references parent(id)
)
  

Я слышал о методе удаления снизу вверх. Что-то вроде этого:

 DELETE FROM child where parent_id IN (SELECT id FROM parent WHERE ...);
DELETE FROM parent WHERE ...;
  

Я также видел следующую версию:

 DELETE FROM child c where exists (SELECT 1 FROM parent p WHERE c.parent_id=p.id AND ...);
DELETE FROM parent WHERE ...;
  

Также существует опция КАСКАДНОГО УДАЛЕНИЯ. Не могли бы вы сравнить производительность упомянутых способов?

Комментарии:

1. Не могли бы вы сами проверить это эмпирически? Тогда у вас будут тайминги, характерные для версии выпуска вашей базы данных (которую вы не упоминаете), вашего сервера, вашей сети и вашей общей среды. Лучшего теста производительности, чем этот, быть не может.

2. Я могу. Но на самом деле меня интересует алгоритм, который Oracle использует для выполнения этих запросов

Ответ №1:

Поскольку вас интересует алгоритм, ваш вопрос, похоже, сводится к различию между IN и EXISTS , поскольку ваши два примера одинаковы, за исключением IN изменения на an EXISTS при удалении из CHILD таблицы.

За эти годы было довольно много написано об этом различии, но, по сути IN , оно обычно используется там, где количество компараторов невелико, тогда EXISTS как более эффективно для подзапросов, возвращающих большее количество компараторов (особенно если эти значения содержат большое количество дубликатов).

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

Из этого есть исключения, и если вы их найдете в Google, вы их найдете, но в целом это, похоже, справедливо.

У Тома Кайта (вице-президент Oracle) есть очень хороший ответ с объяснениями здесь: http://asktom.oracle.com/pls/asktom/f?p=100:11:2148775836129778::::P11_QUESTION_ID:953229842074

У TechRepublic также есть хорошее объяснение здесь: http://www.techrepublic.com/article/oracle-tip-understand-the-difference-between-in-and-exists-in-subqueries/5297080

Надеюсь, это поможет…