Не уверен насчет Oracle TM Contention, но я бы сказал, что обычно обе стороны отношения внешнего ключа индексируются. В противном случае базе данных придется выполнять сканирование таблиц.
- Индекс родительской записи используется всякий раз, когда вы вставляете новую дочернюю запись, чтобы убедиться, что родительский элемент существует. Часто это также первичный ключ, поэтому, конечно, есть индекс.
- Индекс дочерней записи используется всякий раз, когда вы изменяете или удаляете родительскую запись, для выполнения каскадов (включая отказ в обновлении / удалении).
Индексы с обеих сторон также дают базе данных хорошие шансы для выполнения быстрых (индексированных) объединений, независимо от того, с какой стороны предпочитает использовать ее оптимизатор.
РЕДАКТИРОВАТЬ: Имея конкуренцию Googled TM, кажется, что вы, вероятно, упускаете ключи на дочерних записях. Но убедитесь, что они есть с обеих сторон.
РЕДАКТИРОВАТЬ 2: Отвечая на комментарий,
Если у вас есть таблица OLTP с 13 FK для просмотра таблиц, я не
заинтересованы в 13 обновлениях индекса в дополнение к таблице, ПК и любой другой
индексов. Индекс важен, но по конкретным причинам. Если ты никогда
обновить родительский PK или удалить из родительского, дочерний индекс
не очень полезно. Или это?
Зависит от выполняемых вами соединений и запросов. Например, если вы бежите
запрос типа:
SELECT o.something
FROM oltp_tab o JOIN lookup l ON (o.lookup_no = l.lookup_no)
WHERE l.lookup_name = ?
тогда оптимизатору запросов, вероятно, понадобится индекс для дочернего элемента
записи.
Также, согласно http://ashmasters.com/waits/enq-tm-contention/ вам
в значительной степени нужно иметь индексы, если вы измените родительские таблицы в
все. Видимо вы получаете их от одновременных изменений в
родительские и дочерние таблицы, если у вас нет индекса. Так что это наверное
что вы видите (при условии, что вы не делаете очевидные вещи, такие как
обновление указанных столбцов или удаление строк)