oracle 12C 新特性之臨時undo控制

流浪的野狼發表於2015-01-15

1          Oracle 12C 臨時undo

ORACLE 8i中引進了全域性臨時表,而且把臨時表的資料儲存在臨時表空間以減少資源開銷。全域性臨時表在臨時表空間的資料會隨著一個事務或者一個會話而結束。一個臨時表上執行dml操作自身不產生redo,因為這些資料是儲存在臨時表空間,但是這些操作會產生undo,而undo儲存是永久表空間,進而undo反過來會產生redo。而對於這些臨時表是不需要恢復的,因此這些redo是不是可以不要產生,在ORACLE 12C中引進了Temporary undo的功能(temp_undo_enabled引數控制),很大程度上解決了該問題。----參考自xifenfei

根據臨時undo作用,我們進行在臨時表建立中的redo日誌生成情況的觀看。

1.1     關閉臨時undo設定

SQL> show user;

USER is "SCOTT"

SQL> show con_name

 

CON_NAME

------------------------------

PDBA

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

 

NAME                                      VALUE

---------------------------------------------------------------- ----------

redo entries                                  2

redo size                                     736

SQL> create global temporary table temp_gui as select * from dba_objects where 1=2;

 

Table created.

 

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

 

NAME                                      VALUE

---------------------------------------------------------------- ----------

redo entries                                105

redo size                                 28364

可以看出,在只有ddl操作的情況下,redo變化情況還是非常明顯的。

SQL> insert into temp_gui select * from dba_objects;

 

91718 rows created.

 

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

 

NAME                                      VALUE

---------------------------------------------------------------- ----------

redo entries                                   2948

redo size                                      632172

從上面的結果可以看到,在有dml操作(inert)時,產生了大量的redoRedo日誌的變化非常的明顯。

SQL> show parameter temp_undo

 

NAME                         TYPE           VALUE

------------------------------------------------------

temp_undo_enabled            boolean        FALSE

1.2     啟用臨時undo設定

重新登入會話,修改臨時undo引數測試

SQL> alter session set temp_undo_enabled=true;

 

Session altered.

 

SQL> show parameter temp_undo

 

NAME                         TYPE       VALUE

------------------------------------ -----------

temp_undo_enabled            boolean    TRUE

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

 

NAME                                      VALUE

---------------------------------------------------------------- ----------

redo entries                                  2

redo size                                     736

SQL> insert into temp_gui select * from dba_objects;

 

91718 rows created.

 

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

 

NAME                                      VALUE

---------------------------------------------------------------- ----------

redo entries                                  3

redo size                                  1016

從上面結果可以看到,此次測試中,redo資料的產生極其的小。

我們做多次的資料inert看看結果:

SQL> insert into temp_gui select * from dba_objects;

 

91718 rows created.

 

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

 

NAME                                      VALUE

---------------------------------------------------------------- ----------

redo entries                                  3

redo size                                  1016

 

SQL> insert into temp_gui select * from dba_objects;

 

91718 rows created.

 

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

 

NAME                                      VALUE

---------------------------------------------------------------- ----------

redo entries                                  3

redo size                                  1016

 

SQL> select count(*) from temp_gui;

 

  COUNT(*)

----------

    275154

 

SQL> select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

 

NAME                                      VALUE

---------------------------------------------------------------- ----------

redo entries                                  3

redo size                                  1016

同樣沒有新的redo資料產生。

結論:

1、在oracle 12C中,提供了關於全域性臨時變redo生成控制的引數temp_undo_enabled,該引數預設為false,此時臨時表會產生一定量的redo資訊,而當將該引數修改為true時,將抑止redo資訊的產生,從而大大節省redo的儲存空間以及在一定的程度上降低了資料庫效能的開銷。

版權所有,轉載請註明出處

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

相關文章