【问题标题】:Cause of 'enq:TM contention' wait event in oracleoracle 中“enq:TM 争用”等待事件的原因
【发布时间】:2017-05-16 12:02:57
【问题描述】:

在监控 v$session 中的等待事件时,我观察到处于“等待”状态的会话数量以及事件为“enq: TM 争用”。

像下面这样的查询是从不同的会话中运行的,并且没有一个表有任何外键约束。

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

这个等待事件的原因是什么。

【问题讨论】:

    标签: oracle oracle11g database-performance


    【解决方案1】:

    Here你找到了一个简短的解释和一些例子。

    附加提示指示 Oracle 在独占中取出 TM 锁 模式 6(“enq: TM – contention”等待事件)。

    【讨论】:

      【解决方案2】:

      发生这种情况是因为您的数据库中的多个会话需要很长时间来处理一些插入语句。结果,“活动”会话计数非常高,数据库无法接受新的会话连接。

      解决方案:

      enq: TM – 争用事件通常是由于缺少作为 Oracle DML 操作一部分的表的外键约束。一旦通过将外键约束添加到相关表来解决问题,enq: TM – 争用事件就会消失。

      enq: TM 上的等待 - 等待执行插入操作的会话的争用事件几乎总是由于未索引的外键约束。当依赖或子表的外键约束引用父表时,就会发生这种情况表缺少关联键的索引。如果 Oracle 正在对由子表的外键引用的父表中的主键列执行修改,则 Oracle 会在子表上获取表锁。请注意,这些是全表锁 (TM),而不是行级锁 (TX)——因此,这些锁不仅限于一行,而是整个表。自然地,一旦获得了这个表锁,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.
      

      希望之后您将能够启用外键(如果有),然后争用问题将得到解决。

      【讨论】:

      • 亲爱的 XING 我想你错过了索引词。我的意思是未索引的外键约束会导致这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多