Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 Logical I/O Julian Dyke Independent Consultant Web Version juliandyke.com © 2005 Julian Dyke.

Similar presentations


Presentation on theme: "1 Logical I/O Julian Dyke Independent Consultant Web Version juliandyke.com © 2005 Julian Dyke."— Presentation transcript:

1 1 Logical I/O Julian Dyke Independent Consultant Web Version juliandyke.com © 2005 Julian Dyke

2 juliandyke.com © 2005 Julian Dyke 2 Agenda  Introduction  Logical I/Os  Buffer Cache Behaviour  Statistics  Conclusion

3 juliandyke.com © 2005 Julian Dyke 3 Logical I/Os  Logical I/Os are read operations  Buffers are cached in shared memory  Most logical I/Os can be satisfied from cache  The remainder will result in physical I/Os  Logical I/Os include  current reads  consistent reads

4 juliandyke.com © 2005 Julian Dyke 4 Current Reads  Current reads  Current version of block  Can be updated  Can be dirty  Includes all changes  Only one current version of block in buffer cache  Only one current version of block across all instances  Can be used to construct consistent versions

5 juliandyke.com © 2005 Julian Dyke 5 Consistent Reads  Consistent reads  Potentially historic version of block  Consistent to a specific System Change Number (SCN)  Cannot be updated  Cannot be dirty  Can be used to construct consistent versions  Can have multiple versions of same block in buffer cache  Can be  single block (sequential reads)  multi block (scattered reads)  Can be traced using events 10200 / 10201

6 juliandyke.com © 2005 Julian Dyke 6 Logical I/O statistics  session logical reads statistic  Total number of logical reads in session  Unreliable at system level  At session level session logical reads = db block gets + consistent gets  db block gets statistic  Number of current reads  consistent gets statistic  Number of consistent reads

7 juliandyke.com © 2005 Julian Dyke 7 Buffer Pools  There are up to eight buffer pools  DEFAULT  KEEP, RECYCLEOracle 8.0 and above  2K, 4K, 8K, 16K and 32K Oracle 9.0 and above  32K not available on all platforms  Cannot have non-standard block size same as DEFAULT block size

8 juliandyke.com © 2005 Julian Dyke 8 Buffer Pool Headers  One for each buffer pool (usable or unusable)  Externalized in  V$BUFFER_POOL  V$BUFFER_POOL_STATISTICS  Based on X$KCBWBPD  Created in shared pool permanent memory when instance is started  Contain one or more working sets

9 juliandyke.com © 2005 Julian Dyke 9 X$KCBWBPD  Externalises buffer pool header ADDRRAW(4) INDXNUMBER INST_IDNUMBER BP_NAMEVARCHAR2(20) BP_IDNUMBER BP_BLKSZNUMBER BP_GRANSZNUMBER BP_BUFPERGRANNUMBER BP_LO_SIDNUMBER BP_HI_SIDNUMBER BP_SET_CTNUMBER BP_SIZENUMBER BP_STATENUMBER BP_CURRGRANSNUMBER BP_TGTGRANSNUMBER BP_PREVGRANSNUMBER Buffer Pool Name Buffer Pool ID Block Size Granule Size Buffers per Granule Minimum Working Set ID Maximum Working Set ID Number of Working Sets Number of Buffers

10 juliandyke.com © 2005 Julian Dyke 10 Hash Buckets  Hash value of each block calculated from  Data Block Address (DBA)  Block Class  Number of hash buckets dependent on number of buffers in cache e.g. # buffers5006000 # hash buckets641024  Each hash bucket contains  Cache Buffers Chains latch  Pointer to array of double linked lists

11 juliandyke.com © 2005 Julian Dyke 11 Hash Buckets BH # hash chains cache buffers chain latch

12 juliandyke.com © 2005 Julian Dyke 12 Buffer Headers  Each buffer header describes contents of one buffer  All buffers accessed via buffer header  Buffer header contains pointers to  Buffer  Cache Buffers Chains latch  Buffer header includes double linked lists for  Cache Buffers Chain list  Replacement list  Users list  Waiters list

13 juliandyke.com © 2005 Julian Dyke 13 X$BH  Externalises buffer headers ADDRRAW(4) INDXNUMBER INST_IDNUMBER HLADDRRAW(4) BLSIZNUMBER NXT_HASHRAW(4) PRV_HASHRAW(4) NXT_REPLRAW(4) PRV_REPLRAW(4) TS#NUMBER FILE#NUMBER DBARFILNUMBER DBABLKNUMBER OBJNUMBER BARAW(4) CR_SCN_BASNUMBER Hash List Address Block Size Hash List Replacement List Tablespace# Absolute File Number Relative File Number Block Number Object ID Buffer Address

14 juliandyke.com © 2005 Julian Dyke 14 Working Sets  Introduced in Oracle 8.1.5  Each buffer pool contains one or more working sets  Working set header  created in shared pool permanent memory  associated with one DBWn process  protected by cache buffers lru chain latch  Each working set maintains separate set of LRU lists

15 juliandyke.com © 2005 Julian Dyke 15 LRU Lists  In Oracle 9.2 each working set maintains 4 LRU lists  LRU - replacement list - normal blocks  LRU-W - write list - dirty blocks  LRU-XO - object list - buffers involved in  DROP  TRUNCATE  LRU-XR - range list - buffers involved in  ALTER TABLESPACE BEGIN BACKUP  ALTER TABLESPACE END BACKUP  ALTER TABLESPACE OFFLINE  ALTER TABLESPACE READ ONLY

16 juliandyke.com © 2005 Julian Dyke 16 Main and Auxiliary Lists  Each LRU contains  main list  auxiliary list  Auxiliary list includes  dirty buffers identified by DBWn processes  buffers being written  Buffers are moved from main to auxiliary list by DBWn processes to avoid unnecessary scans  Processes scan auxiliary lists first for free buffers  Buffers also allocated to auxiliary list  at startup  after FLUSH_CACHE

17 juliandyke.com © 2005 Julian Dyke 17 Working Set Lists Hot Cold Buffer Header MAIN AUX MAIN AUX MAIN AUX MAIN AUX Replacement List Working Set Header Write List Object List Range List

18 juliandyke.com © 2005 Julian Dyke 18 Replacement List  In Oracle 8.1.5 and above a mid-point insertion algorithm is used  Buffer cache has a hot end and a cold end  Buffers are inserted at mid-point  Mid-point is head of cold end  Starts at hot end - moves down cache  Maximum mid-point determined by _db_percent_hot_default  Default value is 50% Head of Hot End Head of Cold End Hot End Cold End Replacement List

19 juliandyke.com © 2005 Julian Dyke 19 X$KCBWDS  Externalises working set header ADDRRAW(4) INDXNUMBER INST_IDNUMBER SET_IDNUMBER DBWR_NUMNUMBER BLK_SIZENUMBER Working Set ID Database Writer Number MAIN Replacement List AUX Replacement List Number of buffers on MAIN Replacement List Insertion Point Maximum number of Hot Buffers Number of Hot Buffers NXT_REPLRAW(4) PRV_REPLRAW(4) NXT_REPLAXRAW(4) PRV_REPLAXRAW(4) CNUM_REPLRAW(4) ANUM_REPLRAW(4) COLD_HDRAW(4) HBMAXNUMBER HBUFSNUMBER NXT_WRITERAW(4) Number of buffers on AUX Replacement List

20 juliandyke.com © 2005 Julian Dyke 20 Touch Count  Each buffer header maintains  touch count  timestamp  Touch count represents number of 3 second intervals in which buffer has been accessed since  buffer last read into cache  touch count last reset  Each time buffer is accessed  if timestamp more than 3 seconds ago  increment touch count  set timestamp to current time

21 juliandyke.com © 2005 Julian Dyke 21 Touch Count  When buffer reaches tail of cold end  If touch count >= 2 then buffer is moved to hot end  Otherwise used as next free buffer  Hot criteria determined by  _db_aging_hot_criteria  default value is 2 touches  Time interval determined by  _db_aging_touch_time  default value is 3 seconds

22 juliandyke.com © 2005 Julian Dyke 22 Single versus Multi-Block Reads  Single block reads  Used with current reads  Can be used with consistent reads  Waits recorded by db file sequential read  Multi block reads  Frequently used with consistent reads  Maximum number of physical blocks read specified by DB_FILE_MULTIBLOCK_READ_COUNT  Waits recorded by db file scattered read  Blocks moved to cold end of buffer cache

23 juliandyke.com © 2005 Julian Dyke 23 Head of Cold End Head of Hot End Single-Block Reads 92 0 34 3 72 4 52 1 71 2 66 0 49 0 42 1 45 2 52 1 71 2 66 0 42 1 11 1 52 1 71 2 11 1 42 1 2 71 0 92 0 34 3 72 4 45 2 11 1 52 1 42 2 33 1 45 2 11 1 42 2 33 1 34 4 92 0 34 4 72 4 45 2 11 1 42 0 33 1 71 0 87 1 1 72 4 33 1 45 2 Read Block 42 Get first available buffer from cold end Update buffer contentsInsert buffer at head of cold end Read Block 11 Get first available buffer from cold end Update buffer contentsInsert buffer at head of cold end Read Block 42 Update touch count for block 42 Read Block 33 Move block 71 to head of hot end Set touch count on block 71 to zero Get first available buffer from cold end Update buffer contentsInsert buffer at head of cold end Read Block 34 Update touch count for block 34 Read Block 87 Move block 42 to head of hot end Set touch count on block 42 to zero Get first available buffer from cold end Update buffer contentsInsert buffer at head of cold end STOP Block Number Touch Count

24 juliandyke.com © 2005 Julian Dyke 24 Read Block 27 - SCN 132 Get first available buffer from cold end Read current version of block 27 into buffer Apply undo to rollback block to SCN 132 Insert buffer at head of cold end Read Block 27 - SCN 128 Get first available buffer from cold end Read consistent version of block 27 into buffer Apply undo to rollback block to SCN 128 Insert buffer at head of cold end Consistent Reads Head of Cold End Head of Hot End Current Block Consistent Block 56408527 150 3417953327 150 27 150 27 132 3334179527 150 27 132 27 132 27 132 27 128 34179527 150 27 132 27 128 STOP Block Number System Change Number

25 juliandyke.com © 2005 Julian Dyke 25 Multi-Block Reads Head of Cold End Head of Hot End Read Block 1 Get first four available buffers from cold end Read next four blocks into buffers 1234 Insert buffers at head of cold end 12 1 3214321 Move block 1 to cold end 121 Read Block 2 Move block 2 to cold end 2132134 Read Block 3 Move block 3 to cold end Read Block 4 Move block 4 to cold end Read Block 5 Get next four available buffers from cold end Read next four blocks into buffers Insert buffers at head of cold end Move block 5 to cold end 4321555676765878556565675678 Read Block 6 Move block 6 to cold end Read Block 7 Move block 7 to cold end Read Block 8 Move block 8 to cold end STOP DB_FILE_MULTIBLOCK_READ_COUNT = 4

26 juliandyke.com © 2005 Julian Dyke 26 Dirty Blocks  When blocks are updated they are marked dirty  Changes immediately written to redo buffer  Changes written back to disk asynchronously by DBWn process  DBWn process  scans from cold end of MAIN replacement list  moves dirty blocks to auxiliary list  writes dirty blocks back to disk  Written blocks remain on auxiliary list until re-used

27 juliandyke.com © 2005 Julian Dyke 27 Buffer Pinning  In Oracle 8.0 and above, Oracle uses pinning to reduce number of logical I/Os  If buffer will be accessed again by the statement, it is pinned in the buffer cache  Frequently used with index scans  Only appears to be used with consistent gets  not observed with current gets  If pinning was not implemented, number of logical I/Os would significantly increase

28 juliandyke.com © 2005 Julian Dyke 28 Buffer Pinning Statistics  buffer is not pinned count statistic  Number of pin-able buffers not pinned by this session when visited  Equivalent to number of logical I/Os (for that part of statement)  buffer is pinned count statistic  Number of buffers already pinned by this session when visited  Number of buffers visited =  buffer is not pinned count + buffer is pinned count

29 juliandyke.com © 2005 Julian Dyke 29 Consistent Gets Statistics  consistent gets - examination statistic  Number of consistent gets that could be immediately performed without pinning the buffer  Generally apply to indexes  Require one latch get  Included in consistent gets statistic  no work - consistent read gets statistic  Number of consistent gets that could be performed without requiring rollback or cleanout  Generally apply to tables  Require two latch gets  Included in consistent gets statistic

30 juliandyke.com © 2005 Julian Dyke 30 Read Block 1 Segment Header 1 Read Block 1 Segment Header 2 Read Block 1 Segment Header 3 Table T1 Segment Header Data Blocks Empty Blocks Unused Blocks High Water Mark Full Table Scan session logical reads consistent gets no work - consistent read gets buffer is not pinned count table scans (short tables) table scans rows gotten table scans blocks gotten 1 1 2 2 3 3 1 1 1 4 1 4 4 5 5 2 2 8 2 6 6 3 3 3 12 7 7 4 4 4 16 8 8 5 5 20 5 9 9 6 6 24 6 7 10 7 28 7 8 11 8 32 8 9 12 9 36 9 10 13 10 40 10 11 14 11 44 11 12 15 12 48 12 13 16 13 52 13 14 17 14 56 14 15 1 60 15 18 16 1 64 16 19 17 1 68 17 20 18 1 72 18 21 18 1 72 18 22 18 1 72 18 23 Read Block 2 Data Block Read Block 3 Data Block Read Block 4 Data Block Read Block 5 Data Block Read Block 6 Data Block Read Block 7 Data Block Read Block 8 Data Block Read Block 9 Data Block Read Block 10 Data Block Read Block 11 Data Block Read Block 12 Data Block Read Block 13 Data Block Read Block 14 Data Block Read Block 15 Data Block Read Block 16 Data Block Read Block 17 Data Block Read Block 18 Data Block Read Block 19 Data Block Read Block 20 Empty Block Read Block 21 Empty Block SELECT SUM(c2) FROM t1; 0SELECT STATEMENT 10TABLE ACCESS (FULL) OF 'T1' STOP

31 juliandyke.com © 2005 Julian Dyke 31 Full Table Scan - Summary  In Oracle 9.2  segment header initially read 3 times  segment header read again every 10 extents  All blocks are read up to high water mark  For longer tables blocks can be prefetched  Algorithm differs for Automatic Segment Space Managed tablespaces

32 juliandyke.com © 2005 Julian Dyke 32 Table T1 Unique Scan SELECT c2 FROM t1 WHERE c1 = 42; 0SELECT STATEMENT 10TABLE ACCESS (BY INDEX ROWID) OF 'T1' 21INDEX (UNIQUE SCAN) OF 'I1' session logical reads consistent gets consistent gets - examination buffer is not pinned count index fetch by key table fetch by rowid rows fetched by callback Index I1 Leaf Blocks Branch Block 1 1 1 2 2 2 1 3 3 3 2 1 1 1 Read Index Block 1 Branch Block Read Index Block 4 Leaf Block Read Table Block 3 Data Block STOP

33 juliandyke.com © 2005 Julian Dyke 33 Index Organised Table SELECT c2 FROM t1 WHERE c1 = 42; 0SELECT STATEMENT 10INDEX (UNIQUE SCAN) OF 'I1' session logical reads consistent gets consistent gets - examination index fetch by key Index I1 Leaf Blocks Branch Block 1 1 1 Read Index Block 1 Branch Block 2 2 2 1 Read Index Block 3 Leaf Block STOP

34 juliandyke.com © 2005 Julian Dyke 34 Single Table Hash Cluster SELECT c2 FROM t1 WHERE c1 = 42; 0SELECT STATEMENT 10TABLE ACCESS (HASH) OF 'T1' session logical reads consistent gets no work - consistent read gets cluster key scans cluster key scan block gets buffer is not pinned count Table T1 Leaf Blocks 1 1 1 Read Table Block 7 Data Block 1 1 1 1 1 1 STOP

35 juliandyke.com © 2005 Julian Dyke 35 Clustering Factor  Measures relationship between index entries and corresponding data blocks  Used by CBO to calculate cost of using index  Good clustering factor approaches number of blocks in table;  Bad clustering factor approaches number of rows in table  CBO will favour indexes with a better clustering factor Bad Clustering Factor Good Clustering Factor

36 juliandyke.com © 2005 Julian Dyke 36 Table T1 Index I2 Leaf Blocks Branch Block Range Scan - Bad Clustering Factor SELECT c2 FROM t1 WHERE c3 = 42; 0SELECT STATEMENT 10TABLE ACCESS (BY INDEX ROWID) OF 'T1' 21INDEX (RANGE SCAN) OF 'I2' session logical reads consistent gets consistent gets - examination no work - consistent read gets index scans kdiixs1 buffer is not pinned count buffer is pinned count table fetch by rowid Read Index Block 1 Branch Block Read Index Block 3 Leaf Block Read Table Block 2 Data Block Read Index Block 3 Leaf Block (Pinned) Read Table Block 6 Data Block 1 1 1 1 2 2 1 1 1 3 3 1 1 1 2 1 3 3 1 1 1 1 2 1 4 4 1 1 1 2 3 2 4 4 1 1 2 2 3 2 5 5 1 1 2 3 4 3 5 5 1 1 3 3 4 3 Read Index Block 3 Leaf Block (Pinned) Read Table Block 10 Data Block Read Index Block 3 Leaf Block (Pinned) 6 6 1 1 3 4 5 4 Read Table Block 14 Data Block 6 6 1 1 4 4 5 4 7 7 1 1 4 5 6 5 Read Index Block 3 Leaf Block (Pinned) 7 7 1 1 5 5 6 5 8 8 1 1 5 6 7 6 Read Table Block 18 Data Block Read Index Block 3 Leaf Block (Pinned) Read Table Block 22 Data Block STOP

37 juliandyke.com © 2005 Julian Dyke 37 Table T1 Index I3 Leaf Blocks Branch Block Range Scan - Good Clustering Factor SELECT c2 FROM t1 WHERE c4 = 42; 0SELECT STATEMENT 10TABLE ACCESS (BY INDEX ROWID) OF 'T1' 21INDEX (RANGE SCAN) OF 'I3' session logical reads consistent gets consistent gets - examination no work - consistent read gets index scans kdiixs1 buffer is not pinned count buffer is pinned count table fetch by rowid Read Index Block 1 Branch Block Read Index Block 4 Leaf Block Read Table Block 8 Data Block Read Index Block 3 Leaf Block (Pinned) Read Table Block 8 Data Block (Pinned) Read Index Block 3 Leaf Block (Pinned) Read Table Block 8 Data Block (Pinned) Read Index Block 3 Leaf Block (Pinned) Read Table Block 8 Data Block (Pinned) Read Index Block 3 Leaf Block (Pinned) 1 1 1 1 Read Table Block 9 Data Block Read Index Block 3 Leaf Block (Pinned) Read Table Block 9 Data Block (Pinned) 2 2 1 1 1 3 3 1 1 1 2 1 3 3 1 1 1 1 2 1 3 3 1 1 2 2 2 1 3 3 1 1 3 2 2 1 3 3 1 1 4 3 2 1 3 3 1 1 5 3 2 1 3 3 1 1 6 4 2 1 3 3 1 1 7 4 2 1 4 4 1 1 7 5 3 2 4 4 1 1 8 5 3 2 4 4 1 1 9 6 3 2 STOP

38 juliandyke.com © 2005 Julian Dyke 38 Clustering Factor - Summary Bad Clustering Factor Good Clustering Factor session logical reads84 consistent gets84 consistent gets - examination11 no work - consistent gets62 index scans kdiixs111 buffer is not pinned count73 buffer is pinned count59 table fetch by rowid66  Higher clustering factor  Reduces number of logical I/Os required  Increases number of buffers that can be pinned

39 juliandyke.com © 2005 Julian Dyke 39 Row Prefetching  For queries returning more than one row specify maximum number of rows per round trip  If prefetch size too small  Increased number of round trips  Degrades performance  If prefetch size too large  Increased number of packets  May degrade performance

40 juliandyke.com © 2005 Julian Dyke 40 Row Prefetching  Applies to  OCIOCI_ATTR_PREFETCH_ROWS  Pro*CHost Array  JDBCsetRowPrefetch ()  PL/SQLBULK COLLECT  SQL*PlusSET ARRAYSIZE  OCI default prefetch value is 1 (returns 2 rows per fetch) res = OCIAttrSet ( (dvoid *)stmt, (ub4)OCI_HTYPE_STMT, (dvoid *)&prefetchRows, (ub4)0, (ub4)OCI_ATTR_PREFETCH_ROWS, (OCIError *)err );

41 juliandyke.com © 2005 Julian Dyke 41 Row Prefetching  Example - full table scan  1000 row table  31 blocks (+ segment header) Prefetch Size Consistent Gets Prefetch SizeConsistent Gets 11003 2518 3337 4276 5227 10130 2082 5053 10043 25037 50035 100034

42 juliandyke.com © 2005 Julian Dyke 42 Thank you for your interest For more information and to provide feedback please contact me My e-mail address is: info@juliandyke.com My website address is: www.juliandyke.com


Download ppt "1 Logical I/O Julian Dyke Independent Consultant Web Version juliandyke.com © 2005 Julian Dyke."

Similar presentations


Ads by Google