0defb3aa

Целостность ссылок


Вот тут, вероятно, и наступает решающий момент для систем оперативной обработки транзакций (ООТ - OLTP). Их ждет двойной удар - сначала в подчиненной таблице, а потом и в главной.

Возьмите таблицу из и вставьте в нее еще 9 одинаковых строк, чтобы всего их стало 10. Затем выполните следующие тесты и проверьте объем логического ввода/вывода и т.п.:

update t2 set id_gp = id_gp;

10 rows updated.

alter table t1 add constraint t1_pk primary key (id_gp);

alter table t2 add constraint t2_fk_p1 foreign key (id_gp) references t1;

update t2 set id_gp = id_gp; 10 rows updated

Вы обнаружите, что количество прочитанных блоков db block gets (current mode gets) увеличится на 10 после добавления ограничения целостности. Почему? Потому что при каждом обновлении сервер Oracle проверяет ограничение внешнего ключа, и делает это путем просмотра индекса по первичному ключу в главной таблице с помощью current mode gets. Если главная таблица будет достаточно большой, может потребоваться три current mode gets для каждого избыточного обновления столбца в подчиненной таблице.

Теперь перейдем к проблемам главной таблицы. Достаточно только попытаться выполнить обновление "без изменения" строки главной таблицы, если нет индекса по внешнему ключу, и вы обнаружите печально известную блокировку TM/4. Индексы по внешним ключам не обязательны, если значения первичного ключа не изменяются и не удаляются, но если вы сталкиваетесь со случайными "зависаниями" и сообщениях о взаимных блокировках, то, вероятно, вы столкнулись с классической проблемой, - вы сами первичные ключи не обновляете, а вот генератор приложений за кадром это делает.



Содержание раздела