Upload
raaj9850
View
381
Download
3
Tags:
Embed Size (px)
Citation preview
Buffer Cache Waits
#.2
In This Section
1. latch: cache buffers chains
2. latch: cache buffers lru chain 3. latch: cache buffer handles
4. Free Buffer Wait
5. Buffer Busy Wait
6. Write Complete Wait
7. Buffer Exterminate
#.3
Buffer Cache
RedoRedo Lib Lib CacheCache
Buffer Buffer CacheCache
IOIO
LocksLocks
NetworkNetwork
#.4
REDO Log FilesREDO Log Files Data FilesData Files
DBWRDBWRLGWRLGWR
User2User2
User1User1
User3User3
Log BufferLog Buffer
Buffer CacheBuffer CacheLog Log BufferBuffer
Buffer Buffer CacheCache
SGASGALibrary Library CacheCache
Oracle Memory Structures
#.5
Buffer Cache Access
Buffer Cache ManagementLocating Free blocksFinding data blocksManaging LRU listsCleaning Dirty Blocks
Buffer Cache management can cause contentionDifferent from IO ( reading blocks of disk )
#.6
Query
0. Parse statement1. Find object information in data dictionary2. Calculate execution plan3. If full table scan
Look at all blocks of table
4. If index find root of index and follow to key5. Data Dictionary will have info about table or index block
File # Block #
6. Once you know the block DBA (file# + block#) …
Select ename from emp where empno = 12;
#.7
Is Block in cache?Now you have a file# and block#
How do you know if a block is cached?
ShadowShadow
ProcessProcess ??Do you search all the blocks?
Could be 1000s of blocks to search.
Buffer caches are in the multi Gig
#.8
Buffer Cache
Find a block by:
1) Hash of
Data file #
Block#
2) Result = Bucket #
3) Search linked list for that bucket #
What is a hash value
What are Buckets
What is the linked list?
#.9
Concepts
To understand contention on the buffer cache,
need to understand :
1. Linked Lists
2. Hashing
3. Buckets
#.10
Double Linked Lists
03C39000 03C39478
03C38F60 03C39000
03C3900003C38F60 03C39478Address
Next
Previous
#.11
Hashing Function
Simple hash could be a Mod function 1 mod 4 = 1 2 mod 4 = 2 3 mod 4 = 3 4 mod 4 = 0 5 mod 4 = 1 6 mod 4 = 2 7 mod 4 = 3 8 mod 4 = 0
Using “mod 4” as a hash funtion creates 4 “buckets” to store things
#.12
Hash Bucket Fill
Data Block
11
22
00
33
Hash Block’s file# block #’s
Result in a bucket#Put Block in bucket
?
?
?
?
Hash Block’s 1 file# 437 block
#’s
(1+437) mod 4 = 2After a while the buckets become populated with blocksAfter a while the buckets become populated with blocks
#.13
Latches Protect Bucket Contents
BufferHeaders
Data BlocksHashbucket
latches
Buffer Headers contents described by X$BH
#.14
X$bh Describes Contents of Buffer Headers
SQL> desc x$bh Name Type ------------ -------- ADDR RAW(4) DBARFIL NUMBER DBABLK NUMBER OBJ NUMBER HLADDR RAW(4) NXT_HASH RAW(4) PRV_HASH RAW(4)… much more
ADDR DBARFIL DBABLK OBJ HLADDR NXT_HASH PRV_HASH…
A each buffer header contains Information about the data block It points to and the previous and next Buffer header in a linked list
#.15
Cache
03C39000 03C39478
03C38F60 03C39000
03C3900003C38F60 03C39478ADDR
NXT_HASH
PRV_HASH
#.16
X$BH describes HeadersBufferHeaders
Data BlocksHashbucket
latches
HLADDR
NXT_HASH
PRV_HASH
ADDR ADDR
DBARFIL
DBABLKOBJ
x$bh ADDR DBARFIL DBABLK OBJ HLADDR NXT_HASH PRV_HASH
#.17To Find a Block
1. Hash the block address
2. Get Bucket latch
3. Look for header
4. Found, read block in cache
5. Not Found Read block off disk
ShadowShadowProcessProcess
BufferHeaders
Data BlocksHashbucket
22 33 5544
latches
1122334455
#.18Cache Buffers ChainsHash Buckets
s5s5
s4s4
s3s3
s2s2
s1s1
SessionsSessions
Contention if too many accesses on a bucketContention if too many accesses on a bucket
latches BlockHeaders
Cache Buffer Chain
DataBlocks
#.19
Examples
S1 S2 S3 S4
1. Look up Table
2. Nested Loops
Select t1.val, t2.val
from t1, t2
where t1.c1 = {value}
and t2.id = t1.id;
t1Index_t2
t2
#.20
CBC Solutions
Find SQL ( Why is application hitting the block so hard? ) Nested loops, possibly
Hash Partition Uses Hash Join Hash clusters
Look up tables (“select language from lang_table where ...”) Change application
Use plsql function Spread data out to reduce contention
Select from dual Possibly use x$dual
How do you find the SQL?
#.21CBC: Statspack 9i
Top 5 Timed Events~~~~~~~~~~~~~~~~~~ % TotalEvent Waits Time (s) Ela Time---------------------------- ------------ ----------- --------latch free 21,428 1,914 81.37CPU time 360 15.29PL/SQL lock timer 16 48 2.04SQL*Net message from dblink 4,690 14 .58db file sequential read 1,427 5 .19
Top 5 Timed Events
~~~~~~~~~~~~~~~~~~ % Total
Event Waits Time (s) Ela Time
---------------------------- ------------ ----------- --------
latch free 21,428 1,914 81.37
CPU time 360 15.29
PL/SQL lock timer 16 48 2.04
SQL*Net message from dblink 4,690 14 .58
db file sequential read 1,427 5 .19
Top 5 Timed Events
~~~~~~~~~~~~~~~~~~ % Total
Event Waits Time (s) Ela Time
---------------------------- ------------ ----------- --------
latch free 21,428 1,914 81.37
CPU time 360 15.29
PL/SQL lock timer 16 48 2.04
SQL*Net message from dblink 4,690 14 .58
db file sequential read 1,427 5 .19
Latch Sleep breakdown for DB: CDB Instance: cdb Snaps: 1 -2
-> ordered by misses desc
Latch Name Requests Misses Sleeps Sleeps 1->4
-------------------- ---------- ------- ------ ------------
cache buffers chains 12,123,500 608,415 15,759 0/0/0/0/0
library cache pin 12,027,599 173,446 2,862 172694/743/8/1/0
library cache 12,072,503 98,065 2,373 97739/279/47/0/0
simulator lru latch 606 436 434 6/426/4/0/0
Latch Sleep breakdown for DB: CDB Instance: cdb Snaps: 1 -2
-> ordered by misses desc
Latch Name Requests Misses Sleeps Sleeps 1->4
-------------------- ---------- ------- ------ ------------
cache buffers chains 12,123,500 608,415 15,759 0/0/0/0/0
library cache pin 12,027,599 173,446 2,862 172694/743/8/1/0
library cache 12,072,503 98,065 2,373 97739/279/47/0/0
simulator lru latch 606 436 434 6/426/4/0/0
Fails to find SQL
#.22
CBC: Statspack 10g
Top 5 Timed Events Avg %Total~~~~~~~~~~~~~~~~~~ wait CallEvent Waits Time (s) (ms) Time---------------------------------- ----------- ------ ------CPU time 35 54.3latch: cache buffers chains 46 11 243 17.6latch: library cache pin 35 8 229 12.6latch: library cache 27 6 231 9.8log file sequential read 15 1 60 1.4
Top 5 Timed Events Avg %Total
~~~~~~~~~~~~~~~~~~ wait Call
Event Waits Time (s) (ms) Time---------------------------------- ----------- ------ ------CPU time 35 54.3latch: cache buffers chains 46 11 243 17.6latch: library cache pin 35 8 229 12.6latch: library cache 27 6 231 9.8log file sequential read 15 1 60 1.4
Top 5 Timed Events Avg %Total
~~~~~~~~~~~~~~~~~~ wait Call
Event Waits Time (s) (ms) Time---------------------------------- ----------- ------ ------CPU time 35 54.3latch: cache buffers chains 46 11 243 17.6latch: library cache pin 35 8 229 12.6latch: library cache 27 6 231 9.8log file sequential read 15 1 60 1.4
Fails to find SQL
#.23CBC: ASH select count(*), sql_id, nvl(o.object_name,ash.current_obj#) objn, substr(o.object_type,0,10) otype, CURRENT_FILE# fn, CURRENT_BLOCK# blocknfrom v$active_session_history ash , all_objects owhere event like 'latch: cache buffers chains' and o.object_id (+)= ash.CURRENT_OBJ#group by sql_id, current_obj#, current_file#, current_block#, o.object_name,o.object_typeorder by count(*)/
CNT SQL_ID OBJN OTYPE FN BLOCKN
---- ------------- -------- ------ --- ------
84 a09r4dwjpv01q MYDUAL TABLE 1 93170
SQL Statement: Success
Extra: Hot block
#.24
CBC: OEM
#.25
CBC: ADDM
Problem
SQL Statement
Solution?
#.26
CBC – Further Investigation
select * from v$event_name
where name = 'latch: cache buffers chains'
EVENT# NAME
---------- ----------------------------
58 latch: cache buffers chains
PARAMETER1 PARAMETER2 PARAMETER3
---------- ---------- ----------
address number tries
NOTE: _db_block_hash_buckets = # of hash buckets
_db_blocks_per_hash_latch = # of hash latches
#.27
CBC: what’s the hot block
Can get it from ASH Current_file# Current_block# Where event=‘latch: cache buffers chains”
Sometimes file and block = 0Seems to happen for Nested Loops
Get the hot block real timeUse Hash Latch Address
Ash.p2 = x$bh.hladdr
#.28
Hot Block: X$BH.TCH
Updated when block read Updated by no more than 1 every 3 seconds Can be used to find “hot” blocks
Note: set back to zero when block cycles through the buffer cache
#.29
CBC – Real Timeselect
count(*),
lpad(replace(to_char(p1,'XXXXXXXXX'),' ','0'),16,0) laddr
from v$active_session_history
where event='latch: cache buffers chains'
group by p1;
select o.name, bh.dbarfil, bh.dbablk, bh.tch
from x$bh bh, obj$ o
where tch > 100
and hladdr='00000004D8108330'
and o.obj#=bh.obj
order by tch
COUNT(*) LADDR
---------- ----------------
4933 00000004D8108330
NAME DBARFIL DBABLK TCH
----------- ------- ------ ----
EMP_CLUSTER 4 394 120
#.30
Putting into one Queryselect name, file#, dbablk, obj, tch, hladdr from x$bh bh , obj$ o where o.obj#(+)=bh.obj and hladdr in ( select ltrim(to_char(p1,'XXXXXXXXXX') ) from v$active_session_history where event like 'latch: cache%' group by p1 having count(*) > 5) and tch > 5order by tch
NAME FILE# DBABLK OBJ TCH HLADDR
------------- ----- ------ ------ --- --------
BBW_INDEX 1 110997 66051 17 6BD91180
IDL_UB1$ 1 54837 73 18 6BDB8A80
VIEW$ 1 6885 63 20 6BD91180
VIEW$ 1 6886 63 24 6BDB8A80
DUAL 1 2082 258 32 6BDB8A80
DUAL 1 2081 258 32 6BD91180
MGMT_EMD_PING 3 26479 50312 272 6BDB8A80
This can be misleading, as TCH gets set to 0 ever rap around the LRU and it only gets updated once every 3 seconds, so in this case DUAL was my problem table not MGMT_EMD_PING
#.31
Consistent Read Blocks
Current
Block
(XCUR)
s1s1 s2s2
Update Select
Consistent
Read
(CR)& Undo
Both have same file# and block# and hash to same bucket
#.32
latches
CBC: Consistent Read Blocks
Cache Buffer Chain
Contention: Too Many Buffers in BucketContention: Too Many Buffers in Bucket
s5s5
s4s4
s3s3
s2s2
s1s1
Hash Buckets
BlockHeaders
Max length :_db_block_max_cr_dba10g = 6
#.33
Consistent Read Copies
select count(*) , name , file# , dbablk , hladdr from x$bh bh , obj$ owhere o.obj#(+)=bh.obj and hladdr in ( select ltrim(to_char(p1,'XXXXXXXXXX') ) from v$active_session_history where event like 'latch: cache%' group by p1 )group by name,file#, dbablk, hladdrhaving count(*) > 1order by count(*);
CNT NAME FILE# DBABLK HLADDR
--- ---------- ------ ------- --------
14 MYDUAL 1 93170 2C9F4B20
#.34
CBC : Solution Fine the SQL causing the problem
Change Application Logic Eliminate hot spots
Look up tables Uses pl/sql functions Minimize data per block Possibly using x$dual instead of dual
Index Nested loops Hash join Hash partition index Hah Cluster
Updates, inserts , select for update on blocks while reading those blocks Cause multiple copies
select ash.sql_id, count(*), sql_textfrom v$active_session_history ash, v$sqlstats sqlwhere event='latch: cache buffers chains'and sql.sql_id(+)=ash.sql_idgroup by ash.sql_id, sql_text;
#.35
Latch: cache buffer handles
Buffers can be pinned Possibly increase
_db_handles_cached 5 Unsupported
Used when pinning block headers for expected reuse
#.36
Free Buffer Wait
Data Block Cache lack free buffers Tune by
Increase data blocksTry to tune DBWR Improving Inefficient SQL
requesting large # of blocks
#.37
Free Buffer Wait
Finding a Free Block
If the data block isn’t in cache Get a free block and header in the buffer cacheRead it off diskUpdate the free headerRead the block into the buffer cache
Need Free Block to Read in New Data Block
#.38
Finding a Free Block
ShadowShadow
ProcessProcess
When a session reads a block When a session reads a block
Into the bufffer cache how does Into the bufffer cache how does
it find a it find a FREEFREE spot? spot?
#.39
Finding a Free BlockBufferHeaders
Data BlocksHashbucket
latches
1. Arrange the Buffer Headers into an LRU List
2. Scan LRU for a free block
#.40
Cache Buffers LRU
= entry in x$bh
#.41
X$bh Describes Buffer Headers
SQL> desc x$bh Name Type ---------------------- --------- ADDR RAW(4) DBARFIL NUMBER DBABLK NUMBER OBJ NUMBER HLADDR RAW(4) NXT_HASH RAW(4) PRV_HASH RAW(4) NXT_REPL RAW(4) PRV_REPL RAW(4)
NXT_REPL RAW(4) PRV_REPL RAW(4)
HLADDR RAW(4) NXT_HASH RAW(4) PRV_HASH RAW(4)
Cache buffer chains
LRU
#.42
LRU Chain
03C39000 03C38F60
03C38F60 03C39000
03C3900003C38F60 03C39478ADDR
NXT_HASH
PRV_HASH
03C39478
03C38514
03C38638
03C38620
03C385F4
03C38554
NXT_REPL
PRV_REPL
#.43
Cache Buffers LRU list
#.44
Cache Buffers LRU list
LRU Chain of Buffer Headers
Buffer Cache
#.45
Cache Buffers LRU Latch
MRUMRU LRULRUBuffer Headers
“Cold”
LRU = Least Recently UsedMRU = Most Recently Used
One LRU Latch protects the linked list during changes to One LRU Latch protects the linked list during changes to the listthe list
“Hot”
LRU latch
#.46
Session Searching for Free Blocks
MRUMRU LRULRUBuffer Headers
Session
Shadow
1. Go to the LRU end of data blocks
2. Look for first non-dirty block
3. If search too many post DBWR to make free
4. Free Buffer wait
#.47
Free Buffer Wait Solutions
Tune by Increase data blocksTry to tune DBWR
ASYNC If no ASYNC use I/O Slaves (dbwr_io_slaves)
Multiple DBWR (db_writer_processes) Direct I/O
Tune Inefficient SQL requesting large # of blocks
#.48
Session Finding a Free Block
MRUMRU LRULRU
Hot End
Mid-Point Mid-Point InsertionInsertion
Get LRU LatchGet LRU Latch
Find Free Find Free BlockBlock
Insert HeaderInsert HeaderRelease LRU LatchRelease LRU Latch
session
LRU Latch
#.49
DBWR taking Dirty Blocks offMRUMRU LRULRUBuffer Headers LRU
DBWR
Dirty List of Buffer Headers LRUW
latch
LRU latch also covers DBWR list of dirty blocs
#.50
Cache Buffers LRU Latch
MRUMRU LRULRU
Mid-Point Mid-Point InsertionInsertion
Oracle Tracks the touch count of blocks. As the Oracle Tracks the touch count of blocks. As the block is pushed to the LRU end, if it’s touch count block is pushed to the LRU end, if it’s touch count is 3 or more, it’s promoted to the MRU endis 3 or more, it’s promoted to the MRU end
#.51
Solution: Multiple SetsMultiple Sets
_db_block_lru_latches = 8_db_block_lru_latches = 810gR2 with cpu_count = 210gR2 with cpu_count = 2 X$KCBWDS – set descriptorX$KCBWDS – set descriptor
Set 1Set 1
Set 2Set 2
LRU Latch 1
LRU Latch 2
#.52
Working Sets select
ds.set_id,
ds.blk_size ,
bp.BUFFERS,
nvl(bp.name.’unused’)
from
x$kcbwds ds,
v$buffer_pool bp
where
ds.set_id >= bp.lo_setid (+) and
ds.set_id <= bp.hi_setid (+)
/
SET_ID BLK_SIZE BUFFERS NAME---------- ---------- -------- ------- 16 32768
15 32768
14 16384
13 16384
12 8192
11 8192
10 4096
9 4096
8 2048
7 2048
6 8192 4972 DEFAULT
5 8192 4972 DEFAULT
4 8192
3 8192
2 8192
1 8192
#.53
Test Case
8 Sessions reading separate tables Tables were too big to hold in cache cache option set on each table
Result : lots of buffer cache churn Expected to get “latch: cache buffer chains
LRU”
#.54
simulator lru latch
#.55
CBC – Further Investigation
select p2, count(*)
from v$active_session_history
where event='latch free'
group by p2
select * from v$latchname where latch#=127
P2 COUNT(*)---------- ---------- 127 3556
LATCH# NAME
---------- --------------
127 simulator lru latch
select * from v$event_name
where name = 'latch free'PARAMETER1 PARAMETER2 PARAMETER3
---------- ---------- ----------
address number tries
#.56
db_cache_advice
Alter system set db_cache_advice=off;
Group “other” is very small compared to I/O wait time – not a problem
#.57
Cache Buffers LRU Latch : Solution Other
Increase Size of Buffer Cache Using multiple cache buffers
Keep, recycle
Possibly increase _db_block_lru_latchesNot supported
#.58
Buffer Busy Waits
User 1 tries to change a buffer header User 2 has buffer header “locked” (pinned)
11
22
00
33
User1User1User2User2
#.59
BBW Solution Paths
1. Find Block type Resolve if possible
2. Tune SQL Find SQL How often is it called By how many Users
3. Eliminate Hot Block Find Object Find Block Type
Block Types: Undo Header
use AUM (or add more RBS) Undo Block – hot spot in UNDO Data
index – hot spot, partition table – free lists, ASSM, partition
Segment header – free lists table datablock -> freelists
Freelist blocks – free lists groups File Header Block – look at extent
allocation
There is a hot block, eliminate the hot block
#.60
BBW: StatspackTop 5 Timed Events Avg %Total~~~~~~~~~~~~~~~~~~ wait CallEvent Waits Time(s) (ms) Time
------------------------ ----- ------- ----- ------
buffer busy waits 5,832 263 45 28.2
log file parallel write 248 125 505 13.4
read by other session 902 103 114 11.1
db file parallel write 2,166 94 43 10.1
db file sequential read 653 81 125 8.7
Top 5 Timed Events Avg %Total~~~~~~~~~~~~~~~~~~ wait CallEvent Waits Time(s) (ms) Time
------------------------ ----- ------- ----- ------
buffer busy waits 5,832 263 45 28.2
log file parallel write 248 125 505 13.4
read by other session 902 103 114 11.1
db file parallel write 2,166 94 43 10.1
db file sequential read 653 81 125 8.7Class Waits Wait Time (s) Avg Time (ms)
------------------ ----- ------------- -------------
file header block 264 203 769
data block 6,070 162 27
undo header 355 0 1
segment header 44 0 1
Class Waits Wait Time (s) Avg Time (ms)
------------------ ----- ------------- -------------
file header block 264 203 769
data block 6,070 162 27
undo header 355 0 1
segment header 44 0 1
fails to find Object
#.61
BBW: ASH
Finds Object Block Type SQL Statement
CNT OBJ OTYPE SQL_ID BLOCK_TYPE TBS--- --------------- ----- ------------- ----------------- --------
2 BBW_INDEX_VAL_I INDEX 635xhydd6fzgg segment header SYSTEM
2 0 635xhydd6fzgg usn 5 header UNDOTBS1
3 0 1hsb81ypyrfs5 file header block UNDOTBS1
32 BBW_INDEX_VAL_I INDEX 1hsb81ypyrfs5 data block SYSTEM
33 BBW_INDEX_VAL_I INDEX 6avm49ys4k7t6 data block SYSTEM
34 BBW_INDEX_VAL_I INDEX 5wqps1quuxqr4 data block SYSTEM
#.62BBW: OEM
#.63Solutions
#.64
BBW Block Typesselect rownum n,ws.classfrom v$waitstat;
NAME P1 P2 P3
----------------- ----- ------ -----
buffer busy waits file# block# class#
NAME P1 P2 P3
----------------- ----- ------ -----
buffer busy waits file# block# class#
select * from v$event_namewhere name = 'buffer busy waits'
N CLASS
--- ------------------
1 data block 2 sort block 3 save undo block 4 segment header 5 save undo header 6 free list 7 extent map
8 1st level bmb 9 2nd level bmb 10 3rd level bmb 11 bitmap block 12 bitmap index block 13 file header block 14 unused 15 system undo header 16 system undo block 17 undo header 18 undo block
Note: Before 10g, P3 was BBW type
If P3 in 100,110,120,130 then read
Now “read by other session”
Else Write, P3 in 200,210,220,230, 231
#.65
Joining ASH with v$waitstatselect o.object_name obj, o.object_type otype, ash.SQL_ID, w.classfrom v$active_session_history ash, ( select rownum class#, class from v$waitstat ) w, all_objects owhere event='buffer busy waits' and w.class#(+)=ash.p3 and o.object_id (+)= ash.CURRENT_OBJ#Order by sample_time;
OBJ OTYPE SQL_ID CLASS
------ ------ ------------- ------------------
TOTO1 TABLE 8gz51m9hg5yuf data blockTOTO1 TABLE 8gz51m9hg5yuf data blockTOTO1 TABLE 8gz51m9hg5yuf segment headerTOTO1 TABLE 8gz51m9hg5yuf data block
#.66
Alternative to ASH: AWRselect
to_char(BEGIN_INTERVAL_TIME,'DD-MON HH:MI'), o.name, s.BUFFER_BUSY_WAITS_DELTAfrom dba_hist_seg_stat s, dba_hist_snapshot sn, obj$ owhere BUFFER_BUSY_WAITS_DELTA > 100 and sn.snap_id = s.snap_id and o.obj# = s.obj#;
TO_CHAR(BEGI NAME BUFFER_BUSY_WAITS_DELTA
------------ ----- ----------------------
11-JAN 10:21 TOTO1 58447
#.67
Example: BBW with Insert
Concurrent inserts will insert into the same blockEach session has to wait for the previous session
to finish it’s writeUsually pretty fastContention builds on highly concurrent applications
Lack of Free Lists Not Using ASSM (Automatic Segment Space
Management)
#.68
Example: Lack of Free List
S1 S2 S3 S4
4 Sessions running
Insert into toto values (null, ‘a’);Commit;
OBJN OTYPE FILEN BLOCKN SQL_ID BLOCK_TYPE
----------- ------ ------ ------ ------------- ------------
54962 TOTO1 TABLE 16 45012 8gz51m9hg5yuf data block 54962 TOTO1 TABLE 16 161 8gz51m9hg5yuf segment header
#.69
Solution1: Free Lists
S1 S2 S3 S4
4 Sessions running
Insert into toto values (null, ‘a’);Commit;
#.70
Solution 2: ASSM
Multiple Bitmap Blocks Track Free SpaceUnformattedUp to 25% FreeUp to 50% FreeUp to 75% FreeFull
Free block chosen by Process IDPossibly instance # for RAC
#.71
Solution 2: ASSMHeaderHeader
Level 2Level 2
Level 1Level 1 Level 1Level 1 Level 1Level 1
Data Data
BlocksBlocks
Bitmap Bitmap BlocksBlocks
#.72
Tablespace Types : ASSMselect
tablespace_name, extent_management LOCAL, allocation_type EXTENTS, segment_space_management ASSM, initial_extentfrom dba_tablespaces
TABLESPACE_NAME LOCAL EXTENTS ASSM
--------------- ---------- --------- ------
SYSTEM LOCAL SYSTEM MANUALUNDOTBS1 LOCAL SYSTEM MANUALSYSAUX LOCAL SYSTEM AUTOTEMP LOCAL UNIFORM MANUALUSERS LOCAL SYSTEM AUTOEXAMPLE LOCAL SYSTEM AUTODATA LOCAL SYSTEM MANUAL
create tablespace data2 datafile '/d3/kyle/data2_01.dbf' size 200Msegment space management auto;
#.73
BBW: ASSM
Consider using Freelists instead of ASSM Normally waits on ASSM blocks should be
too small to warrant using Freelists ASSM is easier, automatically managed
1st level bmb2nd level bmb 3rd level bmb
#.74
BBW on Index
Index
Session 1
Session 2
Session 3
Increasing index key creates a hot spot on the leading index leaf
OBJN OTYPE FILEN BLOCKN SQL_ID BLOCK_TYPE
--------- ----- ----- ------- ------------- ------------
BBW_INDEX_INDEX 1 113599 97dgthz60u28d data block 1
Use Reverse Key indexesBreaks Index scans
Hash Partition IndexMore IOs per index access
#.75
BBW on Index : ADDM Recs
Also consider “reversing” the key
#.76
Example: BBW on RBS
IF BBW happen on old style RBSClass# > 18
Switch to UNDOOld style RBS, the DBA had to figure out # of RBS
SegmentsWith UNDO, it is automatically managed
alter system set undo_management=auto scope=spfile;
#.77
BBW and RBS Segs
OBJN OTYPE FILEN BLOCKN SQL_ID BLOCK_TYPE
----------- ------ ------ ------ ------------- ------------
54962 TOTO1 TABLE 16 45012 8gz51m9hg5yuf data block 54962 TOTO1 TABLE 16 161 8gz51m9hg5yuf segment header0 14 9 8gz51m9hg5yuf 870 14 9 8gz51m9hg5yuf 87
Select CURRENT_OBJ#||' '||o.object_name objn, o.object_type otype, CURRENT_FILE# filen, CURRENT_BLOCK# blockn, ash.SQL_ID, w.class ||' '||to_char(ash.p3) block_typefrom v$active_session_history ash, (select rownum class#, class from v$waitstat ) w, all_objects owhere event='buffer busy waits' and w.class#(+)=ash.p3 and o.object_id (+)= ash.CURRENT_OBJ#Order by sample_time;
#.78
Further Investigation RBS Old Style RBS if Class# > 18
P1 P2 P3 SQL_ID COUNT(*) CLASS
-- ------ -- ------------- -------- ------------------
14 9 87 72wa5hjpzr0by 114 9 87 72wa5hjpzr0by 114 9 87 3gkmtvxzu6p2m 114 9 87 3gkmtvxzu6p2m 1 6 561325 1 7zx1krfcgn88t 8 data block14 9 87 8s29zyzr55z2t 1
select segment_name, segment_typefrom dba_extents where file_id = P1 and P2 between block_id and block_id + blocks – 1;
select segment_name, segment_typefrom dba_extents where file_id = P1 and P2 between block_id and block_id + blocks – 1;
SEGMENT_NAME SEGMENT_TYPE
-------------- --------------
R2 ROLLBACK
#.79
ADDM finds old style RBS
#.80
BBW: File Header Querying ASH, make sure
P1=current_file#P2=current_block#
If not, use p1, p2 and not current_object#Time P1 P2 OBJN OTYPE FN BLOCKN BLOCK_TYPE
----- --- --- ---- ----- -- ------ -----------------
11:44 202 2 -1 0 0 file header block11:44 202 2 TOTO TABLE 1 60218 file header block11:44 202 2 TOTO TABLE 1 60218 file header block11:44 202 2 TOTO TABLE 1 60218 file header block11:44 202 2 TOTO TABLE 1 60218 file header block
SELECT A.OBJECT_ID FROM ALL_OBJECTS A,
( SELECT * FROM ALL_OBJECTS WHERE ROWNUM < 1000) B ORDER BY A.OBJECT_NAME
#.81
BBW : File HeaderTime P1 P2 OBJN OTYPE FN BLOCKN BLOCK_TYPE
----- --- --- ---- ----- -- ------ -----------------
11:44 202 2 TOTO TABLE 1 60218 file header block
Solution is make initial and next extent larger in Temp Table Space
ADDM doesn’t say much
#.82
write complete waits
Usually happens in tandem with free buffer Tune by
Increase data block cache
Happens because shadow wants to access blocks that are currently being written to disk by DBWR
also seen it happen when there is a lot of write to sort the waits are on block 2 of the temp tablespace file
#.83
Write Complete Waits
LRU
DBWR
Dirty List of Buffer Headers LRUW
Session
#.84
Buffer Exterminate
Buffer cache dynamically resized
V$SGA_DYNAMIC_COMPONENTS displays information about the dynamic SGA components. This view summarizes information based on all completed SGA resize operations since instance startup.
V$SGA_CURRENT_RESIZE_OPS displays information about SGA resize operations which are currently in progress. An operation can be a grow or a shrink of a dynamic SGA component.
V$SGA_DYNAMIC_FREE_MEMORY displays information about the amount of SGA memory available for future dynamic SGA resize operations.
Alter system set db_cache_size=50M;
#.85
Summary Buffer Cache Waits
1. latch: cache buffers chains - find SQL Eliminate hot spots
2. latch: cache buffers lru chain – increase sets
3. Free Buffer Wait - increase cache size
4. Buffer Busy Wait Index : alleviate hot spots, partition Data DML : add free lists or use ASSM File Segment Header : looked at high extent
allocations
5. Write Complete Waits - increase cache size