Oracle: удаление снизу вверх - PullRequest
0 голосов
/ 26 октября 2011

Скажем, у меня есть две таблицы:

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 голосов
/ 26 октября 2011

Поскольку вас интересует алгоритм, то, по-видимому, сводится ваш вопрос к разнице между IN и EXISTS, поскольку ваши два примера одинаковы, за исключением того, что IN изменяется на 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

Надеюсь, это helпс ...

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