oracle enq: tm,Tuning enq: TM – contention with foreign key (外键引起的队列)

TM – Enqueue contention 与Table Manipulation相关的入队争用,可以在使用需要锁定表的重组活动显式锁定表时看到。

ID1 ID2的含义

ID1  :  0(LGWR)  or object_number, 即DBA_OBJECTS.OBJECT_ID

ID2:   0 for a normal table / partition lock ; 1 for a partition-wait lock.

常见原因:

A. Due to Missing Foreign Key (FK) index on the FK constraint columns in the Childtables

通常会发生此事件的等待,因为包含外键约束的列上缺少索引。 在这种情况下,Oracle在DELETE,INSERT和UPDATE语句期间被迫在子表上获取TM锁。

B. Enq: TM – contention’ Wait Event (TM Enqueue Contention) Using Parallel DML :

TM locks are Table-level locks that protect the table from being modified mid transaction.

A parallel DML operation’s lock requirement is very different from serial DML. The available locks are controlled by the parameter ‘DML_Locks’.

If you are seeing heavy TM lock contention on objects while using Parallel DML, you should ensure that the number of DML locks specified is realistic for the concurrent workload.

C. Enq: TM – contention’ Wait Event Occurs During ANALYZE INDEX VALIDATE STRUCTURE :

TM (Table Manipulation) enqueue is acquired during : ANALYZE INDEX VALIDATE STRUCTURE If an index is being analyzed using the ANALYZE INDEX VALIDATE STRUCTURE command while a DML operation on the underlying table is being attempted (requiring a TM lock to be placed), then contention on “enq: TM – contention” can occur.

The ANALYZE INDEX command acquires a TM enqueue in share mode on the underlying table; this will block other sessions when they attempt to place a TM lock that is incompatible with a share-mode lock.

SQL>select s.command from v$lock l, v$session s where l.sid = s.sid and l.block = 1 and l.type=’TM’;

演示第一种情况

290019f902e0fc55b2551a0a83c7e88e.png出门滑雪前,不要忘了给你的外键列加上索引!!有时为了数据的完整性不得不加外键,当然是其它从应用程序中控制完整性,如果有外键而忽略了索引,很可能你的数据库会看到上面的负载图,看下面的两个实验

sys@ANBOB> conn anbob/anbob

Connected.

anbob@ANBOB> create table team(id int,name varchar2(20));

Table created.

anbob@ANBOB> insert into team values(1,'HR');

1 row created.

anbob@ANBOB> insert into team values(2,'IBG');

1 row created.

anbob@ANBOB> insert into team values(3,'OSC');

1 row created.

anbob@ANBOB> commit;

Commit complete.

anbob@ANBOB> create table memb(id int,name varchar2(20),tid int,

2 constraint fk_mem_team_id foreign key (tid) references team(id) on delete cascade);

constraint fk_mem_team_id foreign key (tid) references team(id) on delete cascade)

*

ERROR at line 2:

ORA-02270: no matching unique or primary key for this column-list

anbob@ANBOB> alter table team modify id primary key;

Table altered.

anbob@ANBOB> create table memb(id int,name varchar2(20),tid int,

2 constraint fk_mem_team_id foreign key (tid) references team(id) on delete cascade);

Table created.

anbob@ANBOB> select table_name,index_name from user_indexes where TABLE_name='TEAM';

TABLE_NAME INDEX_NAME

------------------------------ ------------------------------

TEAM SYS_C005168

anbob@ANBOB> insert into memb values(1,'anbob',3);

1 row created.

anbob@ANBOB> insert into memb values(2,'adm',1);

1 row created.

anbob@ANBOB> insert into memb values(3,'sal',2);

1 row created.

anbob@ANBOB> commit;

Commit complete.

anbob@ANBOB> delete team where id=1;

1 row deleted.

anbob@ANBOB> select userenv('sessionid') from dual;

USERENV('SESSIONID')

--------------------

2317

anbob@ANBOB>

########新开一个session 2

[oracle@aix ~]$ sqlplus anbob/anbob

SQL*Plus: Release 10.2.0.1.0 - Production on ????????? 6??? 16 17:21:30 2011

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

anbob@ANBOB> delete team where id=2;

挂 起

再新开一个session 3

[oracle@aix ~]$ sqlplus anbob/anbob

SQL*Plus: Release 10.2.0.1.0 - Production on ????????? 6??? 16 17:22:13 2011

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

anbob@ANBOB> insert into memb values(10,'jack',3);

挂起

##########新开一个session 4 ,查看一下lock

sys@ANBOB> col event for a30

sys@ANBOB> /

SID USERNAME BLOCKER EVENT TY LMODE REQUEST OBJECT_NAM OBJECT_TYPE

---------- ---------- ---------- ------------------------------ -- ---------- ---------- ---------- -------------------

141 ANBOB 131 enq: TM - contention TM 3 0 TEAM TABLE

133 ANBOB 141 enq: TM - contention TM 2 0 TEAM TABLE

131 ANBOB SQL*Net message from client TX 6 0

131 ANBOB SQL*Net message from client TM 3 0 MEMB TABLE

141 ANBOB 131 enq: TM - contention TM 0 5 MEMB TABLE

133 ANBOB 141 enq: TM - contention TM 0 3 MEMB TABLE

131 ANBOB SQL*Net message from client TM 3 0 TEAM TABLE

...

166 rdbms ipc message CF 2 0

161 smon timer TS 3 0 I_OBJ# INDEX

168 rdbms ipc message MR 4 0 I_OBJ# INDEX

18 rows selected.

anbob@ANBOB> create index idx_mem_tid on memb(tid);

Index created.

解决方法在子表父字段建索引后,就不再影响其它的insert了

实验2

session1

anbob@ANBOB> insert into team values(4,'HR');

1 row created.

session 2

SQL> insert into memb values(13,'rain',5);

insert into memb values(13,'rain',5)

*

ERROR at line 1:

ORA-02291: integrity constraint (ANBOB.FK_MEM_TEAM_ID) violated - parent key not found

SQL> insert into memb values(13,'rain',4); 又hang 住了

session 3查一下当前的等待

sys@ANBOB> select sid,serial#,event,audsid from v$session where username='ANBOB';

SID SERIAL# EVENT AUDSID

---------- ---------- ------------------------------ ----------

143 3675 enq: TX - row lock contention 2584

154 875 SQL*Net message from client 2597

回到session 1 ctrl+c 取消操作,查看一下当前的audsid ,确认sid143等待是它

SQL> insert into memb values(13,'rain',4);

insert into memb values(13,'rain',4)

*

ERROR at line 1:

ORA-02291: integrity constraint (ANBOB.FK_MEM_TEAM_ID) violated - parent key

not found

SQL> select userenv('sessionid') from dual;

USERENV('SESSIONID')

--------------------

2584

The following script will show all unindexed columns from foreign key constraints for a specific user and it can also be customized to include only the one table :

SELECT * FROM (

SELECT c.table_name, cc.column_name, cc.position column_position

FROM user_constraints c, user_cons_columns cc

WHERE c.constraint_name = cc.constraint_name

AND c.constraint_type = 'R'

AND c.owner = upper('&&owner') and cc.owner = upper('&&owner')

MINUS

SELECT i.table_name, ic.column_name, ic.column_position

FROM user_indexes i, user_ind_columns ic

WHERE i.index_name = ic.index_name

AND c.owner = upper('&&owner') and cc.owner = upper('&&owner')

)

ORDER BY table_name, column_position;

打赏

8732971891f4ba05583674ca6b8145ac.png微信扫一扫,打赏作者吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值