Enqueue Waits : Locks
#.2 Copyright 2006 Kyle Hailey Wait Tree - Locks Waits Disk I/O Library Cache Enqueue Undo TX 6 Row Lock TX 4 ITL Lock HW Lock Redo Buffer Cache SQL*Net TM 3 Row Lock ST Lock TS Lock TX 4 PK/FK
#.3 Copyright 2006 Kyle Hailey 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
#.4 Copyright 2006 Kyle Hailey Statspack Top 5 Timed Events Avg %Total ~~~~~~~~~~~~~~~~~~ wait Call Event Waits Time (s) (ms) Time Enqueue CPU time db file sequential read control file sequential read log file switch completion Top 5 Timed Events Avg %Total ~~~~~~~~~~~~~~~~~~ wait Call Event Waits Time (s) (ms) Time Enqueue CPU time db file sequential read control file sequential read log file switch completion Need more info from v$session_wait
#.5 Copyright 2006 Kyle Hailey v$session_wait SQL> select event, p1,p2,p3 from v$session_wait; EVENT P1 P2 P enqueue SQL> select event, p1,p2,p3 from v$session_wait; EVENT P1 P2 P enqueue 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
#.6 Copyright 2006 Kyle Hailey Enqueue : Args P1 = Type | mode P2 = ID1, depends on P1 P3 = ID2, depends on P1
#.7 Copyright 2006 Kyle Hailey Translating P1 to Lock and Mode SQL> select p1, p1raw from v$session_wait where sid=151; P1 P1RAW Mode Type
#.8 Copyright 2006 Kyle Hailey Translating P1 to Lock and Mode Type: 5458 P1RAW Hex Decimal ASCII 54 = 84 = “T” 58 = 88 = “X” Lock = TX 6 Mode: 0006
#.9 Copyright 2006 Kyle Hailey 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 TX 06
#.10 Copyright 2006 Kyle Hailey Translating p1 to Lock and Mode SELECT chr(bitand(p1, )/ )|| chr(bitand(p1, )/65535) "Lock", mod(p1,16) as "mode" FROM V$SESSION_WAIT Where sid=151 / bitand(p1, 65536) "Mode"
#.11 Copyright 2006 Kyle Hailey Translating P1 to Lock and Mode select sid, event, chr(bitand(P1, )/ )|| chr(bitand(P1, )/65535) as "Type", mod(p1,16) as "mode" from v$session_wait where event = 'enqueue‘; select sid, event, chr(bitand(P1, )/ )|| chr(bitand(P1, )/65535) as "Type", mod(p1,16) as "mode" from v$session_wait where event = 'enqueue‘; SID EVENT Ty mode P2 P enqueue TX SID EVENT Ty mode P2 P enqueue TX
#.12 Copyright 2006 Kyle Hailey Modes 1 Null Null 2 SS Sub share 3 SX Sub exclusive 4 S Share 5 SSX Share/sub exclusive 6 X Exclusive
#.13 Copyright 2006 Kyle Hailey 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
#.14 Copyright 2006 Kyle Hailey Looking at v$lock select * from v$lock where type in ('TX', 'TM'); SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK TX TM TM TX select * from v$lock where type in ('TX', 'TM'); SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK TX TM TM TX TX ID1 = RBS seg# | RBS slot # ID2 = rbs wrap # TM ID1 = object id ID2 = 0
#.15 Copyright 2006 Kyle Hailey 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
#.16 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 Parmeter1 Parmeter2(ID1) Parameter3(ID2) enq: CF name|mode 0 operation enq: HW name|mode table space # block enq: SQ name|mode object # 0 enq: ST name|mode 0 0 enq: TM name|mode object # table/partition enq: TS name|mode tablespace ID dba enq: TX name|mode usn<<16 | slot sequence
#.17 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 enq: ZG - contention Administrative
#.18 Copyright 2006 Kyle Hailey Enqueue Solutions SQ – Sequence Lock logon/logoff problem 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
#.19 Copyright 2006 Kyle Hailey Enqueue Data Needed If highest wait time is Enqueue, Find 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
#.20 Copyright 2006 Kyle Hailey Blockers and Waiters SQL> select * from dba_blockers; HOLDING_SESSION SQL> select * from dba_waiters; WAITING HOLDING LOCK_TYPE MODE_HELD MODE_REQUESTE LOCK_ID1 LOCK_ID Transaction Exclusive Exclusive
#.21 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 AC 10g Lockwait not null is blocker Pre-10g Lockwait not null is the waiter
#.22 Copyright 2006 Kyle Hailey Enqueue : TX 6 Example User 1 SQL> delete from emp where empno = 7934; User 2 SQL> update emp set sal=2000 Where empno = 7934; Exclusive Row Level Lock
#.23 Copyright 2006 Kyle Hailey Enqueue : TX 6 v$session_wait SQL> select event, p1,p2,p3 from v$session_wait; EVENT P1 P2 P enqueue SQL> select event, p1,p2,p3 from v$session_wait; EVENT P1 P2 P enqueue What can we do with this info?
#.24 Copyright 2006 Kyle Hailey Enqueue : TX 6 Type and Mode select sid, event, chr(bitand(P1, )/ )|| chr(bitand(P1, )/65535) as "Type", mod(p1,16) as "mode" from v$session_wait where event = 'enqueue‘; select sid, event, chr(bitand(P1, )/ )|| chr(bitand(P1, )/65535) as "Type", mod(p1,16) as "mode" from v$session_wait where event = 'enqueue‘; SID EVENT Ty mode P2 P enqueue TX SID EVENT Ty mode P2 P enqueue TX
#.25 Copyright 2006 Kyle Hailey Enqueue : TX 6 v$lock select * from v$lock where type in ('TX', 'TM'); SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK TX TM TM TX select * from v$lock where type in ('TX', 'TM'); SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK TX TM TM TX TX ID1 = RBS seg# | RBS slot # ID2 = rbs wrap # TM ID1 = object id ID2 = 0
#.26 Copyright 2006 Kyle Hailey Enqueue : TX 6 Blockers and Waiters SQL> select * from dba_blockers; HOLDING_SESSION SQL> select * from dba_waiters; WAITING HOLDING LOCK_TYPE MODE_HELD MODE_REQUESTE LOCK_ID1 LOCK_ID Transaction Exclusive Exclusive
#.27 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 AC 10g Lockwait not null is blocker Pre-10g Lockwait not null is the waiter
#.28 Copyright 2006 Kyle Hailey Enqueue : TX 4 User 1 SQL> insert into p values(3); User 2 SQL> insert into p values(3); Index on p(id)
#.29 Copyright 2006 Kyle Hailey Enqueue : TX 4 select sid, event, chr(bitand(P1, )/ )|| chr(bitand(P1, )/65535) as "Type", mod(p1,16) as "mode" from v$session_wait where event = 'enqueue‘; select sid, event, chr(bitand(P1, )/ )|| chr(bitand(P1, )/65535) as "Type", mod(p1,16) as "mode" from v$session_wait where event = 'enqueue‘; SID EVENT Ty mode P2 P enqueue TX SID EVENT Ty mode P2 P enqueue TX
#.30 Copyright 2006 Kyle Hailey Enqueue : TX 4 SQL> select sid, type, id1, id2, lmode, request from v$lock where type in ('TX', 'TM'); SID TY ID1 ID2 LMODE REQUEST TX TM TM TM TM TX TX
#.31 Copyright 2006 Kyle Hailey Enqueue : TX 4 - difficult Difficult – uses modifying different data ITL Unique Key Bitmap Index Rare Read only Tablespace Free Lists Two phase commit
#.32 Copyright 2006 Kyle Hailey Enqueue : TX 4 – ITL Data Block Header ITL Data Transaction 1 Info Transaction 2 Info
#.33 Copyright 2006 Kyle Hailey Enqueue : TX 4 – ITL Data Block Header Transaction 1 Data Data Block Header Transaction 2 Row 1 Row 2 Row 3 Transaction 3
#.34 Copyright 2006 Kyle Hailey Enqueue : TX 4 – ITL SQL> select sid, type, id1, id2, lmode, request from v$lock where type in ('TX', 'TM'); SID TY ID1 ID2 LMODE REQUEST TX TM TM TM TX TX SQL> select sid, type, id1, id2, lmode, request from v$lock where type in ('TX', 'TM'); SID TY ID1 ID2 LMODE REQUEST TX TM TM TM TX TX
#.35 Copyright 2006 Kyle Hailey Enqueue : TX 4 – Unique Key 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; User 2 insert into child values (1,2); Exclusive Row Level Lock
#.36 Copyright 2006 Kyle Hailey Enqueue : TX 4 – Unique Key Parent Child ID IDName ValueID PK 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
#.37 Copyright 2006 Kyle Hailey Enqueue : TX 4 - Unique Key SQL> select sid, type, id1, id2, lmode, request from v$lock where type in ('TX', 'TM'); SID TY ID1 ID2 LMODE REQUEST TM TM TX TM TM SQL> select sid, type, id1, id2, lmode, request from v$lock where type in ('TX', 'TM'); SID TY ID1 ID2 LMODE REQUEST TM TM TX TM TM
#.38 Copyright 2006 Kyle Hailey Enqueue : TX 4 – Unique Key Solution Parent Child ID IDName ValueID PK Session 1: Insert into Child ID=1 Session 2: Delete from Parent ID=2 OK – can verify quickly in the child index ID Index
#.39 Copyright 2006 Kyle Hailey 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 B4EE1C g Lockwait not null is blocker Pre-10g Lockwait not null is the waiter
#.40 Copyright 2006 Kyle Hailey Enqueue : TX 4 – Bitmap Indexes Two sessions update keys in same key range
#.41 Copyright 2006 Kyle Hailey Enqueue : ST Space Transaction Lock Used in Dictionary Managed Tables Solution Got to Locally Managed Tablespaces
#.42 Copyright 2006 Kyle Hailey Enqueue : HW Data Empty High Water Mark Header Table
#.43 Copyright 2006 Kyle Hailey Enqueue : HW select sid, event, chr(bitand(P1, )/ )|| chr(bitand(P1, )/65535) as "Type", mod(p1,16) as "mode" from v$session_wait where event = 'enqueue‘; select sid, event, chr(bitand(P1, )/ )|| chr(bitand(P1, )/65535) as "Type", mod(p1,16) as "mode" from v$session_wait where event = 'enqueue‘; SID EVENT Ty mode P2 P enqueue HW SID EVENT Ty mode P2 P enqueue HW
#.44 Copyright 2006 Kyle Hailey 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