2017-01-02 6 views
0

При мониторинге события ожидания в v $ session я наблюдал количество сеансов с состоянием ожидания, а событие было «enq: TM contention».Причина события enq: TM contention в oracle

Запросы, подобные следующим, выполняются из разных сеансов, и ни одна из таблиц не имеет ограничений по внешнему ключу.

INSERT /* APPEND */ INTO tabA SELECT /*+ PARALLEL(t,4) */<select list> FROM tabX t; 
INSERT /* APPEND */ INTO tabA SELECT /*+ PARALLEL(t,4) */<select list> FROM tabY t; 
INSERT /* APPEND */ INTO tabA SELECT /*+ PARALLEL(t,4) */<select list> FROM tabZ t; 
etc 

В чем причина этого события ожидания.

ответ

1

Here вы найдете краткое объяснение и некоторые примеры.

Append намек инструктирует Oracle, чтобы вынуть замок ТМ в эксклюзивном режиме 6 («ENQ: ТМ - утверждение» ожидание события).

0

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

Решение:

ENQ: ТМ - раздор событие, как правило, из-за отсутствия ограничений внешнего ключа на столе, который является частью операции Oracle DML. Как только вы устраните проблему, добавив ограничение внешнего ключа в соответствующую таблицу, конфликтное событие enq: TM исчезнет.

Ожидания на соревновании enq: TM - соревнование для сеансов, ожидающих выполнения операций вставки, почти всегда связаны с неопределенным ограничением внешнего ключа. Это происходит, когда ограничение внешнего ключа зависимой или дочерней таблицы, которое ссылается на родительской таблице отсутствует индекс связанного ключа. Oracle получает блокировку таблицы в дочерней таблице, если она выполняет изменения в столбце первичного ключа в родительской таблице, на который ссылается внешний ключ дочерней таблицы. Обратите внимание, что это полные блокировки таблицы (TM), а не блокировки на уровне строк (TX) -thus, эти блокировки не ограничены строкой, а всей таблицей. Естественно, после того, как эта блокировка таблицы будет приобретена, Oracle заблокирует все другие сеансы, которые стремятся изменить данные дочерней таблицы. После создания индекса в дочерней таблице, выполняющегося в столбце, который ссылается на родительскую таблицу, ожидания из-за конкуренции TM исчезнут.

Поскольку в вашем случае нет никаких ключевых иностранных ограничений на столах, вы можете проверить на приведенных ниже пунктов:

1) Проверьте, если любой из связанных таблиц имеет какие-либо disabled внешние ключи. Если они будут найдены, включите их. Если у вас возникнет проблема при включении, то проверьте блокировку сессии ниже и убейте их.

SQL> select a.sid, a.serial# 
    from v$session a, v$locked_object b, dba_objects c 
    where b.object_id = c.object_id 
    and a.sid = b.session_id 
    and OBJECT_NAME='EMP'; 

    SID SERIAL# 
    ---- -------- 
    753  8910 

Затем убейте эту блокирующую сессию.

SQL> ALTER SYSTEM KILL SESSION '753,8910'; 

session killed. 

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

+0

Уважаемый XING, я думаю, вы пропустите индексное слово. я имею в виду неиндексированные ограничения внешнего ключа, может вызвать эту проблему. –

 Смежные вопросы

  • Нет связанных вопросов^_^