Неиндексированный внешний ключ приводит к конфликту в очереди ТМ - PullRequest
2 голосов
/ 09 декабря 2008

Итак, нам сказали, что одним из источников TM Enq разногласий могут быть неиндексированные FK. У меня вопрос какой.

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

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

Итак, какие FK нужно проиндексировать: столбцы этой таблицы или ее потомки?

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

Ответы [ 2 ]

2 голосов
/ 09 декабря 2008

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

1 голос
/ 09 декабря 2008

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

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

...