gpt4 book ai didi

oracle - oracle中 'enq:TM contention'等待事件的原因

转载 作者:行者123 更新时间:2023-12-02 08:35:20 25 4
gpt4 key购买 nike

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

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

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

此等待事件的原因是什么。

最佳答案

发生这种情况是因为数据库中的多个 session 需要很长时间才能处理某些插入语句。因此,“事件” session 计数非常高,数据库无法接受新的 session 连接。

解决方案:

enq: TM – 争用事件通常是由于 Oracle DML 操作中的表缺少外键约束造成的。一旦通过向相关表添加外键约束来修复问题,enq: TM – 争用事件就会消失。

等待 enq: TM – 等待执行插入操作的 session 的争用事件几乎总是由于未索引的外键约束造成的。当从属表或子表的外键约束引用父表时,就会发生这种情况表缺少关联键上的索引。如果 Oracle 对子表的外键引用的父表中的主键列执行修改,则会获取子表上的表锁。请注意,这些是全表锁 (TM),而不是行级锁 (TX),因此,这些锁不限于行,而是整个表。当然,一旦获得该表锁,Oracle 将阻止所有其他试图修改子表数据的 session 。一旦您在子表中创建了对引用父表的列执行的索引,由于 TM 争用而导致的等待就会消失。

由于在您的情况下表上没有外键约束,因此您可以检查以下几点:

1) 检查任何相关表是否有任何已禁用外键。如果找到请启用它们。如果您在启用时遇到问题,请按如下方式检查阻塞 session 并终止它们。

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

然后终止这个阻塞 session 。

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

session killed.

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

关于oracle - oracle中 'enq:TM contention'等待事件的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41425837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com