2008-12-08 5 views
2

Итак, нам сказали, что одним из источников спора TM Enq может быть unindexed FK. Мой вопрос - какой.Неиндексированный внешний ключ ведет к конфликту с TM Enqueue

У меня есть INSERT INTO Table_B, который записывает TM Enq Wait.

Он содержит PK, который является родительским для других таблиц, и имеет столбцы, которые являются FK, ограниченными другими PK.

Значит, что FK s нуждается в индексировании: столбцы таблицы или ее дети?

NB: Я знаю, что это не единственная причина ТМ Contention. Можете ли вы объяснить, почему это невозможно, если это так.

ответ

2

Не уверен в отношении Oracle TM Contention, но я бы сказал, что обычно обе стороны отношения внешнего ключа индексируются. В противном случае база данных должна будет выполнять сканирование таблиц.

  • Индекс родительской записи используется всякий раз, когда вы вставляете новую дочернюю запись, чтобы убедиться, что родитель существует. Часто это первичный ключ, так что, конечно, имеет индекс.
  • Индекс дочерней записи используется всякий раз, когда вы меняете или удаляете родительскую запись, для выполнения каскадов (включая отказ от обновления/удаления).

Показатели с обеих сторон также дают базе данных хорошие шансы сделать быстрые (индексированные) соединения, независимо от того, с какой стороны его оптимизатор предпочитает исходить.

РЕДАКТОРА: Имея конфликты в Googled TM, похоже, что у вас, вероятно, отсутствуют ключи на дочерних записях. Но обязательно имейте их с обеих сторон.

EDIT 2: Ответ на комментарий,

Если у вас есть таблица OLTP, которая имеет 13 FKs для поиска таблиц, я не увлечена на 13 обновления индекса в дополнение к таблице, рк и любые другие индексы. Индекс важен, но по определенным причинам. Если вы никогда не добавляли , обновите родительский PK или удалите из родителя, индекс child не очень полезен. Или это?

Зависит от объединений и запросов, которые вы используете. Например, если вы запускаете запрос типа:

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/ вы в значительной степени необходимо иметь индексы, если вы измените родительские таблицы, в всех. По-видимому, вы получаете от них одновременные изменения родительских и дочерних таблиц , если у вас нет индекса.Так что это, вероятно, , что вы видите (при условии, что вы не делаете очевидные вещи, как ОБНОВЛЕНИЕ упомянутых столбцов или удаление строк)

+0

Если у вас есть таблица OLTP, которая имеет 13 FK для поисковых таблиц, я не увлекаюсь 13 обновлениями индекса в дополнение к таблице, pk и любым другим индексам. Индекс важен, но по определенным причинам. Если вы никогда не обновляете родительский PK и не удаляете его из родителя, индекс child не так полезен. Или это? – 2008-12-09 16:14:56

1

Родитель (ссылка) столбец задействованной внешнего ключа отношения к индексироваться, потому что на нем должно быть включено уникальное или основное ограничение ключа.

Какой режим TM Enqueue вы видите?