您的位置:首页 > 数据库 > Oracle

Oracle enq: TX contention 和 enq: TM contention 等待事件说明

2011-06-04 18:15 751 查看
和Oracle性能优化密切相关的一些知识参考如下Blog:

Oracle常见的33个等待事件
http://blog.csdn.net/tianlesoftware/archive/2010/08/12/5807800.aspx
锁死锁阻塞Latch等待详解
http://blog.csdn.net/tianlesoftware/archive/2010/08/20/5822674.aspx
OracleLatch说明
http://blog.csdn.net/tianlesoftware/archive/2010/01/27/5263238.aspx


在网上搜到一篇介绍enq:TX和enq:TM的文章。原文地址如下:
http://aprakash.wordpress.com/2011/01/17/enq-tx-row-lock-contention-and-enqtm-contention/

Enqueue这个词其实是lock的另一种描述语。当我们在AWR报告中发现长时间的enqueue等待事件时,说明数据库中出现了阻塞和等待,可以关联AWR报告中的enqueueactivity部分来确定是哪一种锁定出现了长时间等待。

关于Enqueue的所有类型参考《Oracle常见的33个等待事件》中的Equeue说明。在这里,我们看一下enq:TX和enq:TM

一.enq:TXrowlockcontention
enq:Tx会在模式6和4下出现。

Oracle的enqueue包含以下模式:
模式代码
类型
解释
1
Null
Nullmode
2
SS
Sub-Share
3
SX
Sub-Exclusive
4
S
Share
5
SSX
Share/Sub-Exclusive
6
X
Exclusive
1.1enq”TXrowlockcontention-Mode6(Exclusive)
Session1
==========
ANAND@MATRIX>select*fromsa;

AB
--------------------
11
22
33
44
55

Elapsed:00:00:00.03
ANAND@MATRIX>deletefromsawhereA=5;
1rowdeleted.
Elapsed:00:00:00.00

Fromsession2
=====================
ANAND@MATRIX>deletefromsawherea=5;

Checkingfromsyssession(session#3)

Session3
============
SYS@MATRIX>selectaddr,xidusn,xidslot,xidsqn,ubafil,ubablk,ubasqn,ses_addr,xidfromv$transaction;

addrxidusnxidslotxidsqnubafilubablkubasqnses_addrxid
--------------------------------------------------------------------------------------------
218B6D98102984832661339232C8B5C0A001D0050030000
Elapsed:00:00:00.01
SYS@MATRIX>@lock_sid
Entervalueforsid:135
old82:wheresid=&sid
new82:wheresid=135

sidlocktypeid1id2lockheldlockrequesttimeheldstatus
---------------------------------------------------------------------------------------------
135????659211RowExclu(3)None(0)5079.000NotBlocking
135DMLenqueue754040RowExclu(3)None(0)49.000NotBlocking
135????1000Share(4)None(0)5224.000NotBlocking
135Transaction655389848Exclusive(6)None(0)49.000Blocking

SYS@MATRIX>@sw135
old38:sidIN(&1)
new38:sidIN(135)

sidstateeventseq#sec_in_waitp1p2p3p1transl
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
135WAITINGSQL*Netmessagefromclient193131driverid=#bytes=10
0x0000000042455100

SYS@MATRIX>@sw10
old38:sidIN(&1)
new38:sidIN(10)

sidstateeventseq#sec_in_waitp1p2p3p1transl
---------------------------------------------------------------------------------------------
10WAITINGenq:TX-rowlockcontention35146name|mode=usn<

SYS@MATRIX>@enqueue
INST_IDSESSID1ID2LockHeldLockRequestedLockType
-------------------------------------------------------------------------------------------------
1Holder:13565538984860TX
1Waiter:1065538984806TX

Backtosession1
==================
ANAND@MATRIX>commit;
Commitcomplete.
Elapsed:00:00:00.01

Session2
===============
22:22:52ANAND@MATRIX>deletefromsawherea=5;
0rowsdeleted.
Elapsed:00:05:07.70

1.2.enq:TXrowlockcontention–Mode4
Thecommoncauseformode4,enq:TXrowlockcontentionare
(1)UniqueIndex
(2)Foreignkey
(3)Bitmapindexes

1.2.1UniqueIndex
Session1
============
ANAND@MATRIX>altertablesaaddconstraintpk_saprimarykey(B);
Tablealtered.
Elapsed:00:00:00.29
ANAND@MATRIX>descsa
NameNull?Type
----------------------------------------------------------------------------------------------
ANUMBER
BNOTNULLNUMBER

ANAND@MATRIX>select*fromsa;

AB
--------------------
11
22
33
44

Elapsed:00:00:00.04
ANAND@MATRIX>insertintosavalues(5,5);
1rowcreated.
Elapsed:00:00:00.01
Didn’tcommit.Checksession2

Session2
===============
ANAND@MATRIX>insertintosavalues(5,5);

Thesessionhangs.Checkthesessionwaitsandenqueues.

Session3
==============
SYS@MATRIX>@lock_sid
Entervalueforsid:135
old82:wheresid=&sid
new82:wheresid=135

SIDLockTypeID1ID2LockHeldLockRequestTimeHeldSTATUS
---------------------------------------------------------------------------------------------
135????659211RowExclu(3)None(0)5779.000NotBlocking
DMLenqueue754040RowExclu(3)None(0)134.000NotBlocking
????1000Share(4)None(0)5924.000NotBlocking
Transaction3932291069Exclusive(6)None(0)134.000Blocking

Elapsed:00:00:00.03
SYS@MATRIX>@enqueue

INST_IDSESSID1ID2LockHeldLockRequestedLockType
-------------------------------------------------------------------------------------------------
1Holder:135393229106960TX
1Waiter:10393229106904TX
Elapsed:00:00:00.04
SYS@MATRIX>@sw135
old38:sidIN(&1)
new38:sidIN(135)
sidstateeventseq#sec_in_waitp1p2p3p1transl
---------------------------------------------------------------------------------------------
135WAITINGSQL*Netmessagefromclient22945driverid=#bytes=10
0x0000000042455100
Elapsed:00:00:00.01
SYS@MATRIX>@sw10
old38:sidIN(&1)
new38:sidIN(10)

sidstateeventseq#sec_in_waitp1p2p3p1transl
---------------------------------------------------------------------------------------------
10WAITINGenq:TX-rowlockcontention4426name|mode=usn<<16|slot=sequence=10690x54580004:TXmode40x0000000054580004393229

Aftercommitonsession1,thesession2throwsUniqueconstraintviolatederror

Session2
============
ANAND@MATRIX>insertintosavalues(5,5);
insertintosavalues(5,5)
*
ERRORatline1:
ORA-00001:uniqueconstraint(ANAND.PK_SA)violated
Elapsed:00:02:18.10


1.2.2Foreignkey
Session1
===========
ANAND@MATRIX>createtablesa_child(idnumberreferencessa(B),namevarchar2(10));
Tablecreated.
Elapsed:00:00:00.25
ANAND@MATRIX>selectconstraint_name,constraint_type,table_name,r_constraint_name,statusfromuser_constraintswheretable_namein('sa','sa_child');

CONSTRAINT_NAMECTABLE_NAMER_CONSTRAINT_NAMESTATUS
---------------------------------------------------------------------------------------------------
PK_SAPSAENABLED
SYS_C0011533RSA_CHILDPK_SAENABLED
Elapsed:00:00:00.18
ANAND@MATRIX>insertintosavalues(6,6);
1rowcreated.
Elapsed:00:00:00.03

Letsinsertthesamevalue6inSA_CHILDfromSession2

Session2
===========
ANAND@MATRIX>insertintosa_childvalues(6,'DANNY');
Session2hangs.

Session3
===========
SYS@MATRIX>@enqueue

INST_IDSESSID1ID2LockHeldLockRequestedLockType
--------------------------------------------------------------------------------------------------------------
1Holder:13565536088460TX
1Waiter:1065536088404TX

SYS@MATRIX>@lock_sid
Entervalueforsid:135
old82:wheresid=&sid
new82:wheresid=135

SIDLockTypeID1ID2LockHeldLockRequestTimeHeldSTATUS
----------------------------------------------------------------------------------------------------------------------------
135DMLenqueue755940RowExclu(3)None(0)64.000NotBlocking
DMLenqueue754040RowExclu(3)None(0)64.000NotBlocking
????1000Share(4)None(0)183421.000NotBlocking
Transaction655360884Exclusive(6)None(0)64.000Blocking
6rowsselected.
Elapsed:00:00:00.09
SYS@MATRIX>@sw10
old38:sidIN(&1)
new38:sidIN(10)

SIDSTATEEVENTSEQ#SEC_IN_WAITP1P2P3P1TRANSL
----------------------------------------------------------------------------------------------------------------------------------------------------------------
10WAITINGenq:TX-rowlockcontention5827name|mode=usn<<16|slot=sequence=8840x54580004:TXmode40x0000000054580004655360

Elapsed:00:00:00.03
SYS@MATRIX>@sw135
old38:sidIN(&1)
new38:sidIN(135)

SIDSTATEEVENTSEQ#SEC_IN_WAITP1P2P3P1TRANSL
---------------------------------------------------------------------------------------------
135WAITINGSQL*Netmessagefromclient68659driverid=#bytes=100x0000000042455100

So,thesession2iswaitingforenq:TXrowlockcontentionasbeforeinsertingtherowitneedscheckforthevalueintheparenttable.Iftherowisnotthere,thenitwouldthrowerroe“ORA-02291:integrityconstraint(ANAND.SYS_C0011533)violated–parentkeynotfound”.

Aftercommitonsession1,

Session2
===========
ANAND@MATRIX>insertintosa_childvalues(6,'DANNY');
1rowcreated.
Elapsed:00:05:02.03

1.2.3BitmapIndex
Session1
==========
ANAND@MATRIX>select*fromsa;
ABC
------------------------------
1199
2299
3399
4499
6699
5599
7799

7rowsselected.

Elapsed:00:00:00.06
ANAND@MATRIX>createbitmapindexsa_c_bit_indxonsa(C);
Indexcreated.

Elapsed:00:00:00.10
ANAND@MATRIX>insertintosavalues(8,8,99);
1rowcreated.

Elapsed:00:00:00.03

LetstrydeleteingarowfromsatablefromSession2

Session2
=============
ANAND@MATRIX>deletefromsawhereA=1;

Session2hangs.

Session3
===========
SYS@MATRIX>@lock_sid
Entervalueforsid:135
old82:wheresid=&sid
new82:wheresid=135

SIDLockTypeID1ID2LockHeldLockRequestTimeHeldSTATUS
------------------------------------------------------------------------------------------------------------------------------------------------
135DMLenqueue754040RowExclu(3)None(0)87.000NotBlocking
DMLenqueue755940RowExclu(3)None(0)87.000NotBlocking
????1000Share(4)None(0)185049.000NotBlocking
Transaction5898471046Exclusive(6)None(0)87.000Blocking

8rowsselected.

Elapsed:00:00:00.07
SYS@MATRIX>@sw135
old38:sidIN(&1)
new38:sidIN(135)

SIDSTATEEVENTSEQ#SEC_IN_WAITP1P2P3P1TRANSL
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
135WAITINGSQL*Netmessagefromclient79671driverid=#bytes=100x0000000042455100
Elapsed:00:00:00.03
SYS@MATRIX>@sw10
old38:sidIN(&1)
new38:sidIN(10)

SIDSTATEEVENTSEQ#SEC_IN_WAITP1P2P3P1TRANSL
---------------------------------------------------------------------------------------------
10WAITINGenq:TX-rowlockcontention10137name|mode=usn<<16|slot=sequence=10460x54580004:TXmode40x0000000054580004589847

Elapsed:00:00:00.03
SYS@MATRIX>@enqueue
INST_IDSESSID1ID2LockHeldLockRequestedLockType
-------------------------------------------------------------------

1Holder:135589847104660TX
1Waiter:10589847104604TX

Elapsed:00:00:00.04

Assoonassession1,thetransactioninsession2completes.
Session2
=============
ANAND@MATRIX>deletefromsawherea=1;
1rowdeleted.
Elapsed:00:10:00.78

So,thosewerethefewcommoncausesofenq:TXcontentionthatihaveencounteredtillnow.

二.enq:TM–contention
=======================
Comingontoenq:TMcontention,itsatablelevellockandthelockedresourceisdatabaseobjectsliketable,index,partitions..
Themostmostcommoncauseofenq:TMcontentionthatihaveseenisunindexedforeignkeys.But,fewdaysbackicametoknowaboutonemorewhichwasthemainreasonbehindwritingthisblog.

2.1UnindexedForeignKeys
Session1
==========
ANAND@MATRIX>createtableparent_tabasselectdistinctobject_typefromdba_objects;


Tablecreated.
Elapsed:00:00:05.82
ANAND@MATRIX>createtablechild_tab
2as
3selectobject_id,object_type,object_name
4fromall_objects;
Tablealtered.

ANAND@MATRIX>altertableparent_tabaddconstraintpk_parent_tabprimarykey(object_type);



ANAND@MATRIX>altertablechild_tabaddconstraintpk_child_tabprimarykey(object_id);

ANAND@MATRIX>altertablechild_tabaddconstraintfk_child_parent_tab
2foreignkey(object_type)referencesparent_tabondeletecascade;



Tablealtered.

Elapsed:00:00:00.07
ANAND@MATRIX>selectcount(*),object_typefromchild_tabgroupbyobject_type;



COUNT(*)OBJECT_TYPE
-----------------------------
1EDITION
39SEQUENCE
454TABLE
491INDEX
5SYNONYM
10CLUSTER
6rowsselected.

Elapsed:00:00:00.04
ANAND@MATRIX>deletefromparent_tabwhereobject_type='SYNONYM';


1rowdeleted.
Elapsed:00:00:00.01

Session2
============
ANAND@MATRIX>deletefromparent_tabwhereobject_type='OPERATOR';



TheSession2hangs.Letscheckthewaitevents

Session3
==============
SYS@MATRIX>@locks

SESSID1ID2LockHeldREQUESTLockType
------------------------------------------------------------------------------------------------
Holder:13475723030TM
Waiter:1375723005TM
Elapsed:00:00:00.04

SYS@MATRIX>@sw13
old38:sidIN(&1)
new38:sidIN(13)

SIDSTATEEVENTSEQ#SEC_IN_WAITP1P2P3P1TRANSL
---------------------------------------------------------------------------------------------
13WAITINGenq:TM-contention3715name|mode=object#=75723table/partition=00x544D0005:TMmode50x00000000544D0005

Elapsed:00:00:00.03

SYS@MATRIX>selectobject_name,object_typefromdba_objectswhereobject_id=75723;

OBJECT_NAMEOBJECT_TYPE
--------------------------------------------------------------------------------------------------------------------------------------
CHILD_TABTABLE

SYS@MATRIX>@lock_sid
Entervalueforsid:134
old82:wheresid=&sid
new82:wheresid=134

SIDLockTypeID1ID2LockHeldLockRequestTimeHeldSTATUS
--------------------------------------------------------------------------------------------------------------------------------------------
134Transaction262171982Exclusive(6)None(0)25.000NotBlocking
DMLenqueue757220RowExclu(3)None(0)25.000NotBlocking
????1000Share(4)None(0)10303.000NotBlocking
DMLenqueue757230RowExclu(3)None(0)25.000Blocking

Thesimplewaytoresolveis,createanindexontheforeignkeyofchildtable.


Tom同学关于UnindexedForeignKeys的说明:
From:
http://tkyte.blogspot.com/2009/10/httpasktomoraclecomtkyteunindex.html

HavingUnindexedforeignkeyscanbeaperformanceissue.Therearetwoissuesassociatedwithunindexedforeignkeys.Thefirstisthefactthatatablelockwillresultifyouupdatetheparentrecordsprimarykey(veryveryunusual)orifyoudeletetheparentrecordandthechild'sforeignkeyisnotindexed.

Thesecondissuehastodowithperformanceingeneralofaparentchildrelationship.Considerthatifyouhaveanondeletecascadeandhavenotindexedthechildtable(eg:EMPischildofDEPT.Deletedeptno=10shouldcascadetoEMP.Ifdeptnoinempisnotindexed--fulltablescan).Thisfullscanisprobablyundesirableandifyoudeletemanyrowsfromtheparenttable,thechildtablewillbescannedonceforeachparentrowdeleted.

Alsoconsiderthatformost(notall,most)parentchildrelationships,wequerytheobjectsfromthe'master'tabletothe'detail'table.Theglaringexceptiontothisisacodetable(shortcodetolongdescription).Formaster/detailrelationships,ifyoudonotindextheforeignkey,afullscanofthechildtablewillresult.

Tom同学提供的一个查询没有见外键索引的表的SQL:

/*Formattedon2011/6/415:39:24(QP5v5.163.1008.3004)*/
SELECTtable_name,
constraint_name,
cname1
||NVL2(cname2,','||cname2,NULL)
||NVL2(cname3,','||cname3,NULL)
||NVL2(cname4,','||cname4,NULL)
||NVL2(cname5,','||cname5,NULL)
||NVL2(cname6,','||cname6,NULL)
||NVL2(cname7,','||cname7,NULL)
||NVL2(cname8,','||cname8,NULL)
columns
FROM(SELECTb.table_name,
b.constraint_name,
MAX(DECODE(position,1,column_name,NULL))cname1,
MAX(DECODE(position,2,column_name,NULL))cname2,
MAX(DECODE(position,3,column_name,NULL))cname3,
MAX(DECODE(position,4,column_name,NULL))cname4,
MAX(DECODE(position,5,column_name,NULL))cname5,
MAX(DECODE(position,6,column_name,NULL))cname6,
MAX(DECODE(position,7,column_name,NULL))cname7,
MAX(DECODE(position,8,column_name,NULL))cname8,
COUNT(*)col_cnt
FROM(SELECTSUBSTR(table_name,1,30)table_name,
SUBSTR(constraint_name,1,30)constraint_name,
SUBSTR(column_name,1,30)column_name,
position
FROMuser_cons_columns)a,
user_constraintsb
WHEREa.constraint_name=b.constraint_name
ANDb.constraint_type='R'
GROUPBYb.table_name,b.constraint_name)cons
WHEREcol_cnt>
ALL(SELECTCOUNT(*)
FROMuser_ind_columnsi
WHEREi.table_name=cons.table_name
ANDi.column_nameIN
(cname1,
cname2,
cname3,
cname4,
cname5,
cname6,
cname7,
cname8)
ANDi.column_position<=cons.col_cnt
GROUPBYi.index_name)
/



2.2Directpathloadorinsert/*+append*/

Session1
===========
ANAND@MATRIX>descsa
NameNull?Type
-----------------------------------------------------------------------------------------------
ANUMBER
BNUMBER
CNUMBER

ANAND@MATRIX>selectconstraint_name,constraint_typefromuser_constraintswheretable_name='SA';
norowsselected
Elapsed:00:00:00.15
ANAND@MATRIX>insert/*+APPEND*/intosaselect*fromsa;
11rowscreated.
Elapsed:00:00:00.06

Session2
===========
ANAND@MATRIX>insert/*+APPEND*/intosaselect*fromsa;

Session2hangs.

Session3
===============
SYS@MATRIX>@locks

SESSID1ID2LockHeldREQUESTLockType
-------------------------------------------------------------------------------------
Holder:6975726060TM
Waiter:1375726006TM
Elapsed:00:00:0
SYS@MATRIX>@lock_sid
Entervalueforsid:69
old82:wheresid=&sid
new82:wheresid=69

SIDLockTypeID1ID2LockHeldLockRequestTimeHeldSTATUS
-----------------------------------------------------------------------------------------------------------------------
69Transaction458754968Exclusive(6)None(0)55.000NotBlocking
69????1000Share(4)None(0)930.000NotBlocking
69DMLenqueue757260Exclusive(6)None(0)55.000Blocking

Elapsed:00:00:00.04

SYS@MATRIX>@sw13
old38:sidIN(&1)
new38:sidIN(13)

SIDSTATEEVENTSEQ#SEC_IN_WAITP1P2P3P1TRANSL
---------------------------------------------------------------------------------------------
13WAITINGenq:TM-contention4335name|mode=object#=75726table/partition=00x544D0006:TMmode60x00000000544D0006

Elapsed:00:00:00.03
SYS@MATRIX>selectobject_name,object_typefromdba_objectswhereobject_id=75726;
OBJECT_NAMOBJECT_TYPE
-----------------------------
SATABLE

Elapsed:00:00:00.00

So,directmodeinsert,orinsert/*+append*/willtakeTMenqueueinexclusivemode.Andifthetransactiondoesn’tcommit,wecanseelotsofbunchofsessionsstackupbehinditandthatiswhathappenedinmycase.



这2个等待事件也算比较常见的,了解这些对DB优化还是有帮助的。




-------------------------------------------------------------------------------------------------------
Blog:http://blog.csdn.net/tianlesoftware
Email:dvd.dba@gmail.com
DBA1群:62697716(满);DBA2群:62697977(满)DBA3群:62697850(满)
DBA超级群:63306533(满);DBA4群:83829929DBA5群:142216823
DBA6群:158654907聊天群:40132017聊天2群:69087192
--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: