測試APPEND INSERT是否產生UNDO資訊的過程

sqysl發表於2016-07-23


D:\>sqlplus test/test
SQL*Plus: Release 11.1.0.6.0 - Production on 星期三 06月 29 19:46:41 2016
Copyright (c) 1982, 2007, Oracle.  All rights reserved.


連線到:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL>
SQL> commit;  --提交
提交完成。
SQL> alter system flush buffer_cache;  --清緩衝
系統已更改。
SQL> get undo5
  1  select n.name,v.value from v$sesstat v,v$statname n
  2  where v.statistic#=n.statistic#
  3  and n.name in('undo change vector size','redo size','DBWR undo block writes','redo blocks written')
  4* and v.sid=(select distinct sid from v$mystat) 
  --獲取當前會話的('undo change vector size','redo size','DBWR undo block writes','redoblocks written'
SQL> colu name for a30
SQL> /
NAME                                VALUE
------------------------------ ----------
DBWR undo block writes                  0
redo size                               0
redo blocks written                     0
undo change vector size                 0
SQL> get undo_redo
  1  select * from v$sysstat where name in('DBWR undo block writes',
  2*                                       'redo blocks written')
--獲取當前系統的'DBWR undo block writes','redoblocks written'
SQL> /
STATISTIC# NAME                                CLASS      VALUE    STAT_ID
---------- ------------------------------ ---------- ---------- ----------
        75 DBWR undo block writes                  8        214  111270822
       139 redo blocks written                     2       3183 2391431605
SQL>  insert /*+ append*/ into &tab_new select * from &tab_old;   --執行direct path INSERT
輸入 tab_new 的值:  bb
輸入 tab_old 的值:  aa
原值    1:  insert /*+ append*/ into &tab_new select * from &tab_old
新值    1:  insert /*+ append*/ into bb select * from aa
已建立4行。
SQL>  select XIDUSN,xidslot,xidsqn,ubafil,ubablk,ubasqn,ubarec,USED_UBLK
  2     from v$transaction;  --獲取當前事務回滾段
    XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBASQN     UBAREC
---------- ---------- ---------- ---------- ---------- ---------- ----------
 USED_UBLK
----------
         7          4        196          0          0          0          0
         1


SQL>  select name from v$rollname where usn=&usnn;   --獲取當前事務回滾段名
輸入 usnn 的值:  7
原值    1:  select name from v$rollname where usn=&usnn
新值    1:  select name from v$rollname where usn=7
NAME
------------------------------
_SYSSMU7$
SQL>  alter system dump undo header "&un";    --匯出當前事務提交前回滾段頭資訊
輸入 un 的值:  _SYSSMU7$
原值    1:  alter system dump undo header "&un"
新值    1:  alter system dump undo header "_SYSSMU7$"
系統已更改。
SQL> COMMIT;  --提交事務
提交完成。
SQL> ALTER SYSTEM FLUSH BUFFER_CACHE;  --重新整理緩衝
系統已更改。
SQL> ALTER SYSTEM FLUSH BUFFER_CACHE;  --重新整理緩衝
系統已更改。
SQL> GET UNDO5
  1  select n.name,v.value from v$sesstat v,v$statname n
  2  where v.statistic#=n.statistic#
  3  and n.name in('undo change vector size','redo size','DBWR undo block writes','redo blocks written')
  4* and v.sid=(select distinct sid from v$mystat)
--獲取事務執行並提交後的'undo change vector size','redo size','DBWR undo block writes','redo blocks written'資訊
SQL> /
NAME                                VALUE
------------------------------ ----------
DBWR undo block writes                  0
redo size                            4264
redo blocks written                     0
undo change vector size              1064
--注意:事務執行前undo change vector size:0,執行direct path INSERT後,其值:1064,前後差值:1064
SQL> GET UNDO_REDO
  1  select * from v$sysstat where name in('DBWR undo block writes',
  2*                                       'redo blocks written')
--獲取當前系統DBWR undo block writes','redo blocks written'資訊
SQL> /
STATISTIC# NAME                                CLASS      VALUE    STAT_ID
---------- ------------------------------ ---------- ---------- ----------
        75 DBWR undo block writes                  8        216  111270822
       139 redo blocks written                     2       3195 2391431605
--注意:事務執行前DBWR undo block writes:214 ,執行direct path INSERT後,其值:216,前後差值:2
SQL>  alter system dump undo header "&un";    --事務提交後再次匯出事務使用回滾段頭資訊
輸入 un 的值:  _SYSSMU7$
原值    1:  alter system dump undo header "&un"
新值    1:  alter system dump undo header "_SYSSMU7$"
系統已更改。
SQL> ALTER SYSTEM DUMP DATAFILE 2 BLOCK MIN 5391 BLOCK MAX 5393; 
--由匯出事務提交後回滾段頭資訊確定,事務提交後xid對應的回滾段資料檔案及塊號:0x00801510 -->對應檔案號(二進位制前十位):2 塊號(二進位制後22位):5392
系統已更改。
SQL> select object_name from dba_objects where object_id=13697;  --由匯出回滾段塊中,相應事務XID對應的undo資訊中,objn=13697,獲取此UNDO資訊對應的資料庫物件為表BB,這正是我們在其上執行direct path INSERT操作的表;
OBJECT_NAME
--------------------------------------------------------------------------------
BB

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-2122424/,如需轉載,請註明出處,否則將追究法律責任。

相關文章