Вот тест.Моя таблица PARENT имеет 100000 строк.Для пустой таблицы CHILD (с индексом PARENT_ID) удаление занимает много времени:
SQL> set timing on
SQL> delete from parent;
100000 rows deleted.
Elapsed: 00:00:07.24
SQL>
Давайте вставим несколько строк в CHILD.Это создаст одну строку для каждой строки в PARENT
SQL> insert into child
2 select level, level from dual
3 connect by level <= 100000;
100000 rows created.
Elapsed: 00:00:02.21
SQL>
. Если мы сейчас удалим из родительского объекта, он мгновенно завершится неудачей.только одна запись в PARENT занимает немного больше времени ...
SQL> update child set parent_id=99999;
100000 rows updated.
Elapsed: 00:00:09.65
SQL> commit;
SQL> delete from parent;
delete from parent
*
ERROR at line 1:
ORA-02292: integrity constraint (APC.CHILD_FK1) violated - child record found
Elapsed: 00:00:07.32
Таймеры Wallclock, как известно, ненадежны, но это выглядит примерно столько же времени.И как это происходит, время для удаления таблицы PARENT без зависимостей внешнего ключа находится в том же приблизительном значении:
SQL> drop table child;
Table dropped.
Elapsed: 00:00:02.29
SQL> delete from parent;
100000 rows deleted.
Elapsed: 00:00:06.54
SQL>
Таким образом, в основном, есть небольшие или никакие издержки для проверки ограничения внешнего ключа
Существует условие: это верно при условии, что столбец внешнего ключа проиндексирован .Я удалил индекс CHILD_FK1_I, и оператор delete from parent
еще не закончил, когда мне потребовалось набрать этот ответ, то есть около десяти минут.