熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle(blockcleanout)的塊清除

2013-11-13 16:12:18  來源: Oracle 

  Clean out有種: fast commit cleanout

  delayed block cleanout

  如果一個事務(transaction)修改不超過%buffer cache的數據塊時oracle做的是fast commit cleanout

  如果一個事務(transaction)修改的塊超過% buffer cache那麼超過的塊就執行delayed block cleanout

  在事務commit前修改的數據塊已經寫入硬盤當發生commit時oracle並不會把block重新讀入內存來做cleanout這樣成本太高

  而是把cleanout留到下一次對此塊的訪問(selectupdate)時完成

  下面我們來簡單看一下這兩種情況:

  搭建環境

   SQL> show parameter db_cache;
  NAME TYPE VALUE
    
  db_cache_size big integer 

  只需更改M/=M的數據量就會觸發DELAY CLEAN OUT

   SQL> create table t (id int col char()col char()col char()col char());   

  表已創建

  行一個塊

         SQL> insert into t select object_idobject_name from all_objects where rownum <=;
  已創建
  SQL> commit;
  SQL> select * from (
   select rownum rn iddbms_rowidrowid_relative_fno(rowid) file#dbms_rowidrowid_block_number(rowid) block# from t )
   where rn= or rn=;
  RN ID file# block#
     
     
     
  fast clean out 快速塊清除
  SQL> update t set id=idcol=colcol=ccol=ccol=c where id=
   ROWS UPDATED
  SQL> select xidusnxidslotxidsqnubafilubablkubarec from v$transaction;
  XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBAREC
       
       
  SQL> COMMIT;

  提交成功 

   SQL> alter system dump datafile  block ;

  系統已更改

   Start dump data blocks tsn:  file#:  minblk  maxblk 
  buffer tsn:  rdba: x (/)
  scn: xbdb seq: x flg: x tail: xdb
  frmt: x chkval: x type: x=trans data
  Block header dump: x
  Object id on Block? Y
  seg/obj: xd csc: xbdb itc:  flg: E typ:   DATA
  brn:  bdba: x ver: x
  inc:  exflg: 
  Itl Xid Uba Flag Lck Scn/Fsc
  x xab xacaa C  scn xbf
  x xa xacfa  fsc x
  |
  |

  這裡的FLAG已經清除

   data_block_dumpdata header at x
  ===============
  tsiz: xf
  hsiz: x
  pbl: x
  bdba: x
  
  flag=
  ntab=
  nrow=
  frre=
  fsbo=x
  fseo=xd
  avsp=x
  tosp=x
  xe:pti[] nrow= offs=
  x:pri[] offs=xd
  block_row_dump:
  tab  row  @xd
  tl:  fb: HFL lb: x cc: 
  col : [ ] c c
  col : []
                    
                        
                          

   數據內容部分省略  

                           
  col : []
                          
                          
                          
                          
   
                          
  col : []
                          
   
                          
  col : []
                          
   
                          
  end_of_block_dump
  End dump data blocks tsn:  file#:  minblk  maxblk 
  delay clean out 延時塊清除
  SQL> update t set id=idcol=colcol=ccol=ccol=cM的更新數據
  已更新
  SQL> select xidusnxidslotxidsqnubafilubablkubarec from v$transaction;
  XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBAREC
       
       
  SQL> COMMIT;

  提交成功

   SQL> alter system dump datafile  block 大於db_cache_size %的塊

  系統已更改

   SQL> alter system dump datafile  block 小於db_cache_size %的塊

  系統已更改

    Start dump data blocks tsn:  file#:  minblk  maxblk  
  buffer tsn:  rdba: x (/
  scn: xbb seq: x flg: x tail: xb 
  frmt: x chkval: x type: x=trans data 
  Block header dump: x 
  Object id on Block? Y 
  seg/obj: xd csc: xbdb itc:  flg: E typ:   DATA 
  brn:  bdba: x ver: x 
  inc:  exflg:  
  Itl Xid Uba Flag Lck Scn/Fsc 
  x xab xacaa C  scn xb
  x xd xd U  fsc xbb 
  | 
  | 

  大於%的塊未被清除

     data_block_dumpdata header at x
  ===============
  tsiz: xf
  hsiz: x
  pbl: x
  bdba: x
  
  flag=
  ntab=
  nrow=
  frre=
  fsbo=x
  fseo=xd
  avsp=x
  tosp=x
  xe:pti[] nrow= offs=
  x:pri[] offs=xd
  block_row_dump:
  tab  row  @xd
  tl:  fb: HFL lb: x cc: 
  col : [ ] c c
  col : []
                    
                        
                          
   
                          
  col : []
                          
                          
   
                          
  col : []
                          
                          
   
                          
  col : []
                          
                          
   
                          
  end_of_block_dump
  End dump data blocks tsn:  file#:  minblk  maxblk 
  Start dump data blocks tsn:  file#:  minblk  maxblk 
  buffer tsn:  rdba: x (/)
  scn: xbbd seq: x flg: x tail: xbd
  frmt: x chkval: x type: x=trans data
  Block header dump: x
  Object id on Block? Y
  seg/obj: xd csc: xbbd itc:  flg: E typ:   DATA
  brn:  bdba: xa ver: x
  inc:  exflg: 
  Itl Xid Uba Flag Lck Scn/Fsc
  x xab xaceaa C  scn xbf
  x xd xaa C  scn xbb
  |
  |

  小於%的塊被清除

  
 data_block_dumpdata header at x
  ===============
  tsiz: xf
  hsiz: x
  pbl: x
  bdba: x
  
  flag=
  ntab=
  nrow=
  frre=
  fsbo=x
  fseo=xd
  avsp=x
  tosp=x
  xe:pti[] nrow= offs=
  x:pri[] offs=xd
  block_row_dump:
  tab  row  @xd
  tl:  fb: HFL lb: x cc: 
  col : [ ] c  
  col : []
                   
                          
                          
   
                          
                          
  col : []
                          
                          
   
                          
                          
  col : []
                          
                          
   
                          
                          
  col : []
                          
                          
   
                          
  end_of_block_dump
  End dump data blocks tsn:  file#:  minblk  maxblk 

  再次訪問這些塊時會被清除 

  
SQL> set autot on
  SQL> select count(*) from t;
  COUNT(*)
  
  
  Execution Plan
  
   SELECT STATEMENT Optimizer=CHOOSE
    SORT (AGGREGATE)
    TABLE ACCESS (FULL) OF T
  Statistics
  
   recursive calls
   db block gets
   consistent gets
   physical reads
   redo size

  產生很多的REDO信息用於塊清除

  
  bytes sent via SQL*Net to client
   bytes received via SQL*Net from client
   SQL*Net roundtrips to/from client
   sorts (memory)
   sorts (disk)
   rows processed
  SQL> /
  COUNT(*)
  
  
  Execution Plan
  
   SELECT STATEMENT Optimizer=CHOOSE
    SORT (AGGREGATE)
    TABLE ACCESS (FULL) OF T
  Statistics
  
   recursive calls
   db block gets
   consistent gets
   physical reads
   redo size

  再訪問就沒有REDO了

  
  bytes sent via SQL*Net to client
   bytes received via SQL*Net from client
   SQL*Net roundtrips to/from client
   sorts (memory)
   sorts (disk)
   rows processed

  再來看清除的數據塊信息 

  
 SQL> alter system dump datafile  block ;

  系統已更改  

  
SQL> alter system dump datafile  block ;

  系統已更改  

  
Start dump data blocks tsn:  file#:  minblk  maxblk 
  buffer tsn:  rdba: x (/)
  scn: xb seq: x flg: x tail: x
  frmt: x chkval: x type: x=trans data
  Block header dump: x
  Object id on Block? Y
  seg/obj: xd csc: xbca itc:  flg: E typ:   DATA
  brn:  bdba: x ver: x
  inc:  exflg: 
  Itl Xid Uba Flag Lck Scn/Fsc
  x xd xe C  fsc xb
  x xd xd C  scn xbb
  |
  |

  大於%的塊也被清除成功 

  
 data_block_dumpdata header at x
  ===============
  tsiz: xf
  hsiz: x
  pbl: x
  bdba: x
  
  flag=
  ntab=
  nrow=
  frre=
  fsbo=x
  fseo=xd
  avsp=x
  tosp=x
  xe:pti[] nrow= offs=
  x:pri[] offs=xd
  block_row_dump:
  tab  row  @xd
  tl:  fb: HFL lb: x cc: 
  col : [ ] c c
  col : []
                    
                        
                          
   
                          
  col : []
                          
                          
   
                          
  col : []
                          
                          
   
                          
  col : []
                          
   
                          
  end_of_block_dump
  End dump data blocks tsn:  file#:  minblk  maxblk 
  Start dump data blocks tsn:  file#:  minblk  maxblk 
  buffer tsn:  rdba: x (/)
  scn: xba seq: x flg: x tail: xa
  frmt: x chkval: x type: x=trans data
  Block header dump: x
  Object id on Block? Y
  seg/obj: xd csc: xba itc:  flg: E typ:   DATA
  brn:  bdba: xa ver: x
  inc:  exflg: 
  Itl Xid Uba Flag Lck Scn/Fsc
  x xd xec C  scn xb
  x xd xaa C  scn xbb
  |
  |

  小於%的塊不變 

  
 data_block_dumpdata header at x
  ===============
  tsiz: xf
  hsiz: x
  pbl: x
  bdba: x
  
  flag=
  ntab=
  nrow=
  frre=
  fsbo=x
  fseo=xd
  avsp=x
  tosp=x
  xe:pti[] nrow= offs=
  x:pri[] offs=xd
  block_row_dump:
  tab  row  @xd
  tl:  fb: HFL lb: x cc: 
  col : [ ] c  
  col : []
                   
                          
   
                          
  col : []
                          
   
                          
  col : []
                          
   
                          
  col : []
                          
   
                          
  end_of_block_dump
  End dump data blocks tsn:  file#:  minblk  maxblk 


From:http://tw.wingwit.com/Article/program/Oracle/201311/17960.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.