You are on page 1of 43

Enqueue Waits : Locks

#.2
Wait Tree - Locks

Buffer Cache TM 3 Row Lock

Disk I/O TX 6 Row Lock

Enqueue TX 4 ITL Lock


Waits TX 4 PK/FK
Library Cache
Redo HW Lock

SQL*Net ST Lock
TS Lock
Undo

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 Avg %Total
~~~~~~~~~~~~~~~~~~ wait Call
Event Waits Time (s) (ms) Time
-------------------------- ------------ ----------- ------ ------
Enqueue 42 126 3000 96.5
CPU time 4 2.8
db file sequential read 165 1 4 .4
control file sequential read 214 0 1 .1
log file switch completion 2 0 40 .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;
EVENT P1 P2 P3
----------------- -------------- ---------- ----------
enqueue 1415053318 589855 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 Mode: 0006

Hex Decimal ASCII


54 = 84 = “T”
58 = 88 = “X”

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


#.11
Translating P1 to Lock and Mode
select sid,
event,
chr(bitand(P1,-16777216)/16777215)||
chr(bitand(P1,16711680)/65535) as "Type",
mod(p1,16) as "mode"
from v$session_wait
where event = 'enqueue‘;
SID EVENT Ty mode P2 P3
--- ------- -- ---- ------- ----
240 enqueue TX 6 2686995 433
Copyright 2006 Kyle Hailey
#.12

Modes
1 Null Null
2 SS Sub share
3 SX Sub exclusive
4 S Share
5 SSX Share/sub exclusive
6 X 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


#.14
Looking at v$lock
select * from v$lock where type in ('TX', 'TM');

SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK


--- -- ---------- ---------- ----- ------- ----- -----
151 TX 589855 1592 0 6 4049 0
135 TM 53737 0 3 0 4058 0
151 TM 53737 0 3 0 4049 0
135 TX 589855 1592 6 0 4058 1

TX
ID1 = RBS seg# | RBS slot #
ID2 = rbs wrap #
TM
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
#.16
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
Copyright 2006 Kyle Hailey
#.17
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
Copyright 2006 Kyle Hailey
#.18
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

Copyright 2006 Kyle Hailey


#.19
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

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


#.21
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

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 User 2

SQL> delete from emp


where empno = 7934;

SQL> update emp


set sal=2000
Where empno = 7934;

Copyright 2006 Kyle Hailey


#.23

Enqueue : TX 6 v$session_wait
SQL> select event, p1,p2,p3 from v$session_wait;
EVENT P1 P2 P3
----------------- -------------- ---------- ----------
enqueue 1415053318 589855 1592

What can we do with this info?

Copyright 2006 Kyle Hailey


#.24

Enqueue : TX 6 Type and Mode


select sid,
event,
chr(bitand(P1,-16777216)/16777215)||
chr(bitand(P1,16711680)/65535) as "Type",
mod(p1,16) as "mode"
from v$session_wait
where event = 'enqueue‘;
SID EVENT Ty mode P2 P3
--- ------- -- ---- ------- ----
240 enqueue TX 6 2686995 433
Copyright 2006 Kyle Hailey
#.25
Enqueue : TX 6 v$lock
select * from v$lock where type in ('TX', 'TM');

SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK


--- -- ---------- ---------- ----- ------- ----- -----
151 TX 589855 1592 0 6 4049 0
135 TM 53737 0 3 0 4058 0
151 TM 53737 0 3 0 4049 0
135 TX 589855 1592 6 0 4058 1

TX
ID1 = RBS seg# | RBS slot #
ID2 = rbs wrap #
TM
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


#.27
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

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 User 2

SQL> insert into p values(3);

SQL> insert into p values(3);

Copyright 2006 Kyle Hailey


#.29
Enqueue : TX 4
select sid,
event,
chr(bitand(P1,-16777216)/16777215)||
chr(bitand(P1,16711680)/65535) as "Type",
mod(p1,16) as "mode"
from v$session_wait
where event = 'enqueue‘;
SID EVENT Ty mode P2 P3
--- ------- -- ---- ------- ----
240 enqueue TX 4 2686995 433
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 TY ID1 ID2 LMODE REQUEST


---------- -- ---------- ---------- ---------- ----------
139 TX 327689 1901 0 4
146 TM 55166 0 3 0
146 TM 55168 0 2 0
139 TM 55166 0 3 0
139 TM 55168 0 2 0
139 TX 720914 168 6 0
146 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

Transaction 1 Info
DataBlock
Data Block
Transaction 2 Info
Header
Header
ITL

Data

Copyright 2006 Kyle Hailey


#.33

Enqueue : TX 4 – ITL

DataBlock
Data Block
Header
Header
Transaction 1 Transaction 3
Transaction 2
Row 3
Row 2
Data
Row 1

Copyright 2006 Kyle Hailey


#.34

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


---------- -- ---------- ---------- ---------- ----------
148 TX 65559 1284 0 4
135 TM 54557 0 3 0
151 TM 54557 0 3 0
148 TM 54557 0 3 0
135 TX 524312 1592 6 0
151 TX 65559 1284 6 0

Copyright 2006 Kyle Hailey


#.35

Enqueue : TX 4 – Unique Key


Exclusive Row Level Lock
User 1 User 2
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;
insert into child values (1,2);
delete from parent;

Copyright 2006 Kyle Hailey


#.36

Enqueue : TX 4 – Unique Key


PK Parent Child
ID ID Value 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
from v$lock where type in ('TX', 'TM');
SID TY ID1 ID2 LMODE REQUEST
---------- -- ---------- ---------- ---------- ---------
151 TM 54548 0 2 0
151 TM 54550 0 3 0
151 TX 524306 1590 6 0
135 TM 54548 0 3 0
135 TM 54550 0 0 4

Copyright 2006 Kyle Hailey


#.38
Enqueue : TX 4 – Unique Key
Solution
PK Parent Child
Index
ID ID Value ID ID Name

Session 1: Insert into Child ID=1


Session 2: Delete from Parent ID=2
OK – can Copyright
verify2006quickly
Kyle Hailey
in the child index
#.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


#.43
Enqueue : HW
select sid,
event,
chr(bitand(P1,-16777216)/16777215)||
chr(bitand(P1,16711680)/65535) as "Type",
mod(p1,16) as "mode"
from v$session_wait
where event = 'enqueue‘;
SID EVENT Ty mode P2 P3
--- ------- -- ---- ---- -------
240 enqueue HW 6 4 16777715
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