Enqueue Waits : Locks
Wait Tree - Locks
Buffer Cache Disk I/O Enqueue Waits Library Cache Redo SQL*Net Undo TM 3 Row Lock TX 6 Row Lock TX 4 ITL Lock TX 4 PK/FK HW Lock ST Lock TS Lock
#.2
Copyright 2006 Kyle Hailey
#.3
Enqueue Types
DDL Locks Data Dictionary
Row Cache Library Cache Locks
DML Locks Data Locks
Row locks Table Locks
Internal Structure Locks
High Water Buffer Header Sequence Cache Space Transaction Temporary Space
Copyright 2006 Kyle Hailey
#.4
Statspack
Top 5 Timed Events Top 5 Timed Events ~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~ Avg %Total Avg %Total wait wait Call Call Event Waits Time (s) Event Waits Time (s) (ms) (ms) Time Time -------------------------- ------------ ----------- ------ ------------------------------- ------------ ----------- ------ -----Enqueue Enqueue CPU time CPU time db file sequential read db file sequential read control file sequential read control file sequential read log file switch completion log file switch completion 42 42 165 165 214 214 2 2 126 126 4 4 1 1 0 0 0 0 3000 3000 4 4 1 1 40 40 96.5 96.5 2.8 2.8 .4 .4 .1 .1 .1 .1
Need more info from v$session_wait
Copyright 2006 Kyle Hailey
#.5
v$session_wait
SQL> select event, p1,p2,p3 from v$session_wait; SQL> select event, p1,p2,p3 from v$session_wait; EVENT EVENT enqueue enqueue P1 P1 1415053318 1415053318 P2 P2 589855 589855 P3 P3 1592 1592 ----------------- -------------- ---------- -------------------------- -------------- ---------- ----------
What can we do with this info? Note: v$session_wait is for current waits. Need ASH or some similar data source for historic analysis
Copyright 2006 Kyle Hailey
#.6
Enqueue : Args
P1 = Type | mode P2 = ID1 , depends on P1 P3 = ID2 , depends on P1
Copyright 2006 Kyle Hailey
#.7
Translating P1 to Lock and Mode
SQL> select p1, p1raw from v$session_wait where sid=151; P1 P1RAW ---------- -------1415053318 54580006
Type Mode
Copyright 2006 Kyle Hailey
#.8
Translating P1 to Lock and Mode
P1RAW -------54580006
Type: 5458
Hex Decimal 54 = 84 58 = 88 ASCII = T = X
Mode: 0006
Lock = TX 6
Copyright 2006 Kyle Hailey
#.9
Translating P1 to Lock and Mode
column Type format a4 column Mode format a4 select sid, chr(to_number(substr(p1raw,1,1)) * 16 + to_number(substr(p1raw,2,1))) || chr(to_number(substr(p1raw,3,1)) * 16 + to_number(substr(p1raw,4,1))) Type, substr(p1raw,8,1) as "Mode" from v$session_wait where name=enqueue; SID TYPE Mode --- ---- ---151 TX 06
Copyright 2006 Kyle Hailey
#.10
Translating p1 to Lock and Mode
SELECT chr(bitand(p1,-16777216)/16777215)|| chr(bitand(p1, 16711680)/65535) "Lock", mod(p1,16) as "mode" FROM V$SESSION_WAIT Where sid=151 / bitand(p1, 65536) "Mode"
Copyright 2006 Kyle Hailey
Translating P1 to Lock and Mode
select sid, select sid, event, event, chr(bitand(P1,-16777216)/16777215)|| chr(bitand(P1,-16777216)/16777215)|| chr(bitand(P1,16711680)/65535) as "Type", chr(bitand(P1,16711680)/65535) as "Type", mod(p1,16) as "mode" mod(p1,16) as "mode" from v$session_wait from v$session_wait where event = 'enqueue; where event = 'enqueue; SID SID ----240 240 EVENT EVENT ------------enqueue enqueue Ty Ty --TX TX mode mode ------6 6 P2 P3 P2 P3 ------- ---------- ---2686995 433 2686995 433
#.11
Copyright 2006 Kyle Hailey
#.12
Modes
1 2 3 4 5 6 Null SS SX S SSX X Null Sub share Sub exclusive Share Share/sub exclusive Exclusive
Copyright 2006 Kyle Hailey
#.13
Types
CF Control File HW High Water SQ - Sequence ST - Space Transaction TM - DML TS Temporary Segment / Table Space TX Transaction UL DBMS_LOCK UN User Named US Undo Segment
Copyright 2006 Kyle Hailey
Looking at v$lock
select * from v$lock where type in ('TX', 'TM'); select * from v$lock where type in ('TX', 'TM');
#.14
SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK --- -- ---------- ---------- ----- ------- ----- ------- -- ---------- ---------- ----- ------- ----- ----151 TX 589855 1592 0 6 4049 0 151 TX 589855 1592 0 6 4049 0 135 TM 53737 0 3 0 4058 0 135 TM 53737 0 3 0 4058 0 151 TM 53737 0 3 0 4049 0 151 TM 53737 0 3 0 4049 0 135 TX 589855 1592 6 0 4058 1 135 TX 589855 1592 6 0 4058 1
TX TM
ID1 = RBS seg# | RBS slot # ID2 = rbs wrap # ID1 = object id ID2 = 0
Copyright 2006 Kyle Hailey
#.15
ID1 and ID2 Examples
Lock = TX
ID1
= RBS seg# | RBS slot # ID2 = rbs wrap #
Lock = TM
ID1
= object id ID2 = 0
ID1 and ID2 meanings can be determined from v$event_name in 10g
Copyright 2006 Kyle Hailey
ID1 and ID2 Definitions
column parameter1 format a15 column parameter2 format a15 column parameter3 format a15 column lock format a8 Select substr(name,1,7) as "lock",parameter1,parameter2,parameter3 from v$event_name where name like 'enq%'
LOCK ------enq: CF enq: HW enq: SQ enq: ST enq: TM enq: TS enq: TX Parmeter1 --------name|mode name|mode name|mode name|mode name|mode name|mode name|mode Parmeter2(ID1) ------------0 table space # object # 0 object # tablespace ID usn<<16 | slot Parameter3(ID2) --------------operation block 0 0 table/partition dba sequence
#.16
Copyright 2006 Kyle Hailey
Enqueues Decoded in 10g
10gR2 waits distinguish 208 enqueues
enq: DB - contention Administrative enq: HW - contention Configuration enq: KO - fast object checkpoint Application enq: PW - flush prewarm buffers Application enq: RO - contention Application enq: RO - fast object reuse Application enq: SQ - contention Configuration enq: SS - contention Configuration enq: ST - contention Configuration enq: TM - contention Application enq: TW - contention Administrative enq: TX - allocate ITL entry Configuration enq: TX - index contention Concurrency enq: TX - row lock contention Application enq: UL - contention Application Copyright 2006 Kyle Hailey enq: ZG - contention Administrative
#.17
Enqueue Solutions
SQ Sequence Lock
logon/logoff problem
#.18
TX - mode 6
application problem
Look at what application is doing Find SQL Look at locked data
TX - mode 4
probably ITL problem find the object and SQL
HW High Water
Look at object and SQL use LMT, freelists, pre-allocate extents,
ST - Space Transaction
only one per database used for space allocations uet, fet Find object use LMT
UL - User Lock
find out what application is doing
Copyright 2006 Kyle Hailey
Enqueue Data Needed
If highest wait time is Enqueue ,
Find
#.19
out the kind of Enqueue and tune it
To tune enqueues we need one of the following to determine the type of enqueue
ASH
Data v$session_wait data Sql Trace with waits
Copyright 2006 Kyle Hailey
#.20
Blockers and Waiters
SQL> select * from dba_blockers;
HOLDING_SESSION --------------10
SQL> select * from dba_waiters;
WAITING HOLDING LOCK_TYPE MODE_HELD MODE_REQUESTE LOCK_ID1 LOCK_ID2 ------- ------- ---------- ---------- ------------- -------- -------14 10 Transaction Exclusive Exclusive 458765 2379
Copyright 2006 Kyle Hailey
V$session
select sid, row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#, lockwait from v$session;
SID ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# LOCKWAIT --- ------------- -------------- --------------- ------------- -------141 53651 3 53980 0 143 -1 0 0 0 144 -1 0 0 0 149 -1 0 0 0 151 53737 4 428 0 410343AC
#.21
10g Lockwait not null is blocker Pre-10g Lockwait not null is the waiter
Copyright 2006 Kyle Hailey
#.22
Enqueue : TX 6 Example
Exclusive Row Level Lock User 1 SQL> delete from emp where empno = 7934; SQL> update emp set sal=2000 Where empno = 7934; User 2
Copyright 2006 Kyle Hailey
#.23
Enqueue : TX 6 v$session_wait
SQL> select event, p1,p2,p3 from v$session_wait; SQL> select event, p1,p2,p3 from v$session_wait; EVENT EVENT enqueue enqueue P1 P1 1415053318 1415053318 P2 P2 589855 589855 P3 P3 1592 1592 ----------------- -------------- ---------- -------------------------- -------------- ---------- ----------
What can we do with this info?
Copyright 2006 Kyle Hailey
Enqueue : TX 6 Type and Mode
select sid, select sid, event, event, chr(bitand(P1,-16777216)/16777215)|| chr(bitand(P1,-16777216)/16777215)|| chr(bitand(P1,16711680)/65535) as "Type", chr(bitand(P1,16711680)/65535) as "Type", mod(p1,16) as "mode" mod(p1,16) as "mode" from v$session_wait from v$session_wait where event = 'enqueue; where event = 'enqueue; SID SID ----240 240 EVENT EVENT ------------enqueue enqueue Ty Ty --TX TX mode mode ------6 6 P2 P3 P2 P3 ------- ---------- ---2686995 433 2686995 433
#.24
Copyright 2006 Kyle Hailey
Enqueue : TX 6 v$lock
select * from v$lock where type in ('TX', 'TM'); select * from v$lock where type in ('TX', 'TM');
#.25
SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK --- -- ---------- ---------- ----- ------- ----- ------- -- ---------- ---------- ----- ------- ----- ----151 TX 589855 1592 0 6 4049 0 151 TX 589855 1592 0 6 4049 0 135 TM 53737 0 3 0 4058 0 135 TM 53737 0 3 0 4058 0 151 TM 53737 0 3 0 4049 0 151 TM 53737 0 3 0 4049 0 135 TX 589855 1592 6 0 4058 1 135 TX 589855 1592 6 0 4058 1
TX TM
ID1 = RBS seg# | RBS slot # ID2 = rbs wrap # ID1 = object id ID2 = 0
Copyright 2006 Kyle Hailey
#.26
Enqueue : TX 6 Blockers and Waiters
SQL> select * from dba_blockers;
HOLDING_SESSION --------------10
SQL> select * from dba_waiters;
WAITING HOLDING LOCK_TYPE MODE_HELD MODE_REQUESTE LOCK_ID1 LOCK_ID2 ------- ------- ---------- ---------- ------------- -------- -------14 10 Transaction Exclusive Exclusive 458765 2379
Copyright 2006 Kyle Hailey
Enqueue : TX 6 V$session
select sid, row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#, lockwait from v$session;
SID ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# LOCKWAIT --- ------------- -------------- --------------- ------------- -------141 53651 3 53980 0 143 -1 0 0 0 144 -1 0 0 0 149 -1 0 0 0 151 53737 4 428 0 410343AC
#.27
10g Lockwait not null is blocker Pre-10g Lockwait not null is the waiter
Copyright 2006 Kyle Hailey
#.28
Enqueue : TX 4
Index on p(id) User 1 SQL> insert into p values(3); SQL> insert into p values(3); User 2
Copyright 2006 Kyle Hailey
Enqueue : TX 4
select sid, select sid, event, event, chr(bitand(P1,-16777216)/16777215)|| chr(bitand(P1,-16777216)/16777215)|| chr(bitand(P1,16711680)/65535) as "Type", chr(bitand(P1,16711680)/65535) as "Type", mod(p1,16) as "mode" mod(p1,16) as "mode" from v$session_wait from v$session_wait where event = 'enqueue; where event = 'enqueue; SID SID ----240 240 EVENT EVENT ------------enqueue enqueue Ty Ty --TX TX mode mode ------4 4 P2 P3 P2 P3 ------- ---------- ---2686995 433 2686995 433
#.29
Copyright 2006 Kyle Hailey
#.30
Enqueue : TX 4
SQL> select sid, type, id1, id2, lmode , request from v$lock where type in ('TX', 'TM'); SID ---------139 146 146 139 139 139 146 TY ID1 ID2 LMODE REQUEST -- ---------- ---------- ---------- ---------TX 327689 1901 0 4 TM 55166 0 3 0 TM 55168 0 2 0 TM 55166 0 3 0 TM 55168 0 2 0 TX 720914 168 6 0 TX 327689 1901 6 0
Copyright 2006 Kyle Hailey
#.31
Enqueue : TX 4 - difficult
Difficult uses modifying different data ITL Unique Key Bitmap Index Rare Read only Tablespace Free Lists Two phase commit
Copyright 2006 Kyle Hailey
#.32
Enqueue : TX 4 ITL
Data Block Data Block Header Header ITL Transaction 1 Info Transaction 2 Info
Data
Copyright 2006 Kyle Hailey
#.33
Enqueue : TX 4 ITL
Data Block Data Block Header Header Transaction 1 Transaction 2 Row 3 Row 2 Data Row 1 Transaction 3
Copyright 2006 Kyle Hailey
#.34
Enqueue : TX 4 ITL
SQL> select sid, type, id1, id2, lmode , request SQL> select sid, type, id1, id2, lmode , request from v$lock where type in ('TX', 'TM'); from v$lock where type in ('TX', 'TM'); SID TY ID1 ID2 LMODE REQUEST SID TY ID1 ID2 LMODE REQUEST ---------- -- ---------- ---------- ---------- ------------------- -- ---------- ---------- ---------- ---------148 TX 148 TX 135 TM 135 TM 151 TM 151 TM 148 TM 148 TM 135 TX 135 TX 151 TX 151 TX 65559 65559 54557 54557 54557 54557 54557 54557 524312 524312 65559 65559 1284 1284 0 0 0 0 0 0 1592 1592 1284 1284 0 0 3 3 3 3 3 3 6 6 6 6 4 4 0 0 0 0 0 0 0 0 0 0
Copyright 2006 Kyle Hailey
#.35
Enqueue : TX 4 Unique Key
Exclusive Row Level Lock User 1 create table parent ( id number primary key); create table child ( id number references parent, name varchar2(20)); insert into parent values (1); insert into child values (1,2); commit; delete from parent;
Copyright 2006 Kyle Hailey
User 2
insert into child values (1,2);
#.36
Enqueue : TX 4 Unique Key
PK ID Parent ID Value Child ID Name
Session 1: Insert into Child ID=1 Session 2: Delete from Parent ID=2 : would require a FTS of child still not atomic, solution lock child Enqueue TX 4
Copyright 2006 Kyle Hailey
#.37
Enqueue : TX 4 - Unique Key
SQL> select sid, type, id1, id2, lmode , request SQL> select sid, type, id1, id2, lmode , request from v$lock where type in ('TX', 'TM'); from v$lock where type in ('TX', 'TM'); SID TY ID1 ID2 LMODE REQUEST SID TY ID1 ID2 LMODE REQUEST ---------- -- ---------- ---------- ---------- ------------------ -- ---------- ---------- ---------- --------151 TM 54548 0 2 0 151 TM 54548 0 2 0 151 TM 54550 0 3 0 151 TM 54550 0 3 0 151 TX 524306 1590 6 0 151 TX 524306 1590 6 0 135 TM 54548 0 3 0 135 TM 54548 0 3 0 135 TM 54550 0 0 4 135 TM 54550 0 0 4
Copyright 2006 Kyle Hailey
PK
Enqueue : TX 4 Unique Key Solution
Parent ID Index ID Child ID Name Value
#.38
ID
Session 1: Insert into Child ID=1 Session 2: Delete from Parent ID=2 OK can Copyright 2006 Kyle Haileyin the child index verify quickly
#.39
Enqueue : TX 4 V$session
select sid, row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#, lockwait from v$session;
SID ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# LOCKWAIT ----- ------------- -------------- --------------- ------------- -------135 -1 0 0 0 40B4EE1C 137 -1 0 0 0 138 -1 0 0 0 139 -1 0 0 0 140 -1 0 0 0 141 53651 3 53980 0
10g Lockwait not null is blocker Pre-10g Lockwait not null is the waiter
Copyright 2006 Kyle Hailey
#.40
Enqueue : TX 4 Bitmap Indexes
Two sessions update keys in same key range
Copyright 2006 Kyle Hailey
#.41
Enqueue : ST
Space Transaction Lock Used in Dictionary Managed Tables Solution
Got
to Locally Managed Tablespaces
Copyright 2006 Kyle Hailey
#.42
Enqueue : HW
Table
Header
Data
High Water Mark Empty
Copyright 2006 Kyle Hailey
Enqueue : HW
select sid, select sid, event, event, chr(bitand(P1,-16777216)/16777215)|| chr(bitand(P1,-16777216)/16777215)|| chr(bitand(P1,16711680)/65535) as "Type", chr(bitand(P1,16711680)/65535) as "Type", mod(p1,16) as "mode" mod(p1,16) as "mode" from v$session_wait from v$session_wait where event = 'enqueue; where event = 'enqueue; SID SID ----240 240 EVENT EVENT ------------enqueue enqueue Ty Ty --HW HW mode P2 P3 mode P2 P3 ---- ---- ---------- ---- ------6 4 16777715 6 4 16777715
#.43
Copyright 2006 Kyle Hailey
#.44
Enqueue : HW
Use Freelists
Cause
multiple jumps in High Water Mark
Pre-Allocate Extents
Alter
table XXXX allocate extent;
Hidden Parameter
bump_highwater_mark_count
ASSM
Automatic segment space management
Copyright 2006 Kyle Hailey