85
Buffer Cache Waits

06 buffer cache

Embed Size (px)

Citation preview

Page 1: 06  buffer cache

Buffer Cache Waits

Page 2: 06  buffer cache

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

Page 3: 06  buffer cache

#.3

Buffer Cache

RedoRedo Lib Lib CacheCache

Buffer Buffer CacheCache

IOIO

LocksLocks

NetworkNetwork

Page 4: 06  buffer cache

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

Page 5: 06  buffer cache

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

Page 6: 06  buffer cache

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

Page 7: 06  buffer cache

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

Page 8: 06  buffer cache

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

Page 9: 06  buffer cache

#.9

Concepts

To understand contention on the buffer cache,

need to understand :

1. Linked Lists

2. Hashing

3. Buckets

Page 10: 06  buffer cache

#.10

Double Linked Lists

03C39000 03C39478

03C38F60 03C39000

03C3900003C38F60 03C39478Address

Next

Previous

Page 11: 06  buffer cache

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

Page 12: 06  buffer cache

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

Page 13: 06  buffer cache

#.13

Latches Protect Bucket Contents

BufferHeaders

Data BlocksHashbucket

latches

Buffer Headers contents described by X$BH

Page 14: 06  buffer cache

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

Page 15: 06  buffer cache

#.15

Cache

03C39000 03C39478

03C38F60 03C39000

03C3900003C38F60 03C39478ADDR

NXT_HASH

PRV_HASH

Page 16: 06  buffer cache

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

Page 17: 06  buffer cache

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

Page 18: 06  buffer cache

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

Page 19: 06  buffer cache

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

Page 20: 06  buffer cache

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

Page 21: 06  buffer cache

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

Page 22: 06  buffer cache

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

Page 23: 06  buffer cache

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

Page 24: 06  buffer cache

#.24

CBC: OEM

Page 25: 06  buffer cache

#.25

CBC: ADDM

Problem

SQL Statement

Solution?

Page 26: 06  buffer cache

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

Page 27: 06  buffer cache

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

Page 28: 06  buffer cache

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

Page 29: 06  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

Page 30: 06  buffer cache

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

Page 31: 06  buffer cache

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

Page 32: 06  buffer cache

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

Page 33: 06  buffer cache

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

Page 34: 06  buffer cache

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

Page 35: 06  buffer cache

#.35

Latch: cache buffer handles

Buffers can be pinned Possibly increase

_db_handles_cached 5 Unsupported

Used when pinning block headers for expected reuse

Page 36: 06  buffer cache

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

Page 37: 06  buffer cache

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

Page 38: 06  buffer cache

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

Page 39: 06  buffer cache

#.39

Finding a Free BlockBufferHeaders

Data BlocksHashbucket

latches

1. Arrange the Buffer Headers into an LRU List

2. Scan LRU for a free block

Page 40: 06  buffer cache

#.40

Cache Buffers LRU

= entry in x$bh

Page 41: 06  buffer cache

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

Page 42: 06  buffer cache

#.42

LRU Chain

03C39000 03C38F60

03C38F60 03C39000

03C3900003C38F60 03C39478ADDR

NXT_HASH

PRV_HASH

03C39478

03C38514

03C38638

03C38620

03C385F4

03C38554

NXT_REPL

PRV_REPL

Page 43: 06  buffer cache

#.43

Cache Buffers LRU list

Page 44: 06  buffer cache

#.44

Cache Buffers LRU list

LRU Chain of Buffer Headers

Buffer Cache

Page 45: 06  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

Page 46: 06  buffer cache

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

Page 47: 06  buffer cache

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

Page 48: 06  buffer cache

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

Page 49: 06  buffer cache

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

Page 50: 06  buffer cache

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

Page 51: 06  buffer cache

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

Page 52: 06  buffer cache

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

Page 53: 06  buffer cache

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

Page 54: 06  buffer cache

#.54

simulator lru latch

Page 55: 06  buffer cache

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

Page 56: 06  buffer cache

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

Page 57: 06  buffer cache

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

Page 58: 06  buffer cache

#.58

Buffer Busy Waits

User 1 tries to change a buffer header User 2 has buffer header “locked” (pinned)

11

22

00

33

User1User1User2User2

Page 59: 06  buffer cache

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

Page 60: 06  buffer cache

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

Page 61: 06  buffer cache

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

Page 62: 06  buffer cache

#.62BBW: OEM

Page 63: 06  buffer cache

#.63Solutions

Page 64: 06  buffer cache

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

Page 65: 06  buffer cache

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

Page 66: 06  buffer cache

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

Page 67: 06  buffer cache

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

Page 68: 06  buffer cache

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

Page 69: 06  buffer cache

#.69

Solution1: Free Lists

S1 S2 S3 S4

4 Sessions running

Insert into toto values (null, ‘a’);Commit;

Page 70: 06  buffer cache

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

Page 71: 06  buffer cache

#.71

Solution 2: ASSMHeaderHeader

Level 2Level 2

Level 1Level 1 Level 1Level 1 Level 1Level 1

Data Data

BlocksBlocks

Bitmap Bitmap BlocksBlocks

Page 72: 06  buffer cache

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

Page 73: 06  buffer cache

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

Page 74: 06  buffer cache

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

Page 75: 06  buffer cache

#.75

BBW on Index : ADDM Recs

Also consider “reversing” the key

Page 76: 06  buffer cache

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

Page 77: 06  buffer cache

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

Page 78: 06  buffer cache

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

Page 79: 06  buffer cache

#.79

ADDM finds old style RBS

Page 80: 06  buffer cache

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

Page 81: 06  buffer cache

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

Page 82: 06  buffer cache

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

Page 83: 06  buffer cache

#.83

Write Complete Waits

LRU

DBWR

Dirty List of Buffer Headers LRUW

Session

Page 84: 06  buffer cache

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

Page 85: 06  buffer cache

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