ORACLE 12C Temporary undo 测试

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:ORACLE 12C Temporary undo 测试

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

ORACLE 8i中引进了全局临时表,而且把临时表的数据存储在临时表空间以减少资源开销。全局临时表在临时表空间的数据会随着一个事务或者一个会话而结束。一个临时表上执行dml操作自身不产生redo,因为这些数据是存储在临时表空间,但是这些操作会产生uundo,而undo存储是永久表空间,进而undo反过来会产生redo。而对于这些临时表是不需要恢复的,因此这些redo是不是可以不要产生,在ORACLE 12C中引进了Temporary undo的功能(temp_undo_enabled参数控制),很大程度上解决了该问题

创建临时表

CDB_CDB$ROOT@SYS> conn chf/xifenfei@pdb
已连接。
CDB_PDB@CHF> select * from v$version;
BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0
PL/SQL Release 12.1.0.1.0 - Production                                                    0
CORE    12.1.0.1.0      Production                                                        0
TNS for 64-bit Windows: Version 12.1.0.1.0 - Production                                   0
NLSRTL Version 12.1.0.1.0 - Production                                                    0

temp_undo_enabled=false测试

CDB_PDB@CHF> show parameter temp_undo_enabled;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
temp_undo_enabled                    boolean     FALSE
CDB_PDB@CHF> create global temporary table g_t_xifenfei(c1 number(8), c2 char(100));
表已创建。
CDB_PDB@CHF> select name, value from v$mystat natural join v$statname
  2    where name = 'redo size' or name = 'redo entries';
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
redo entries                                                             29
redo size                                                              8596
CDB_PDB@CHF> insert into g_t_xifenfei select level, level from dual connect by level <= 10000;
已创建 10000 行。
CDB_PDB@CHF> select name, value from v$mystat natural join v$statname
  2    where name = 'redo size' or name = 'redo entries';
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
redo entries                                                            314
redo size                                                             69892

这里可以发现当temp_undo_enabled=false之时,redo的量在该执行过程中还是增加的很明显,从8596增加到69892(增加了61296 byte的redo),redo entries也增加了285

temp_undo_enabled=true测试

CDB_PDB@CHF> alter session set temp_undo_enabled = true;
会话已更改。
CDB_PDB@CHF> select name, value from v$mystat natural join v$statname
  2    where name = 'redo size' or name = 'redo entries';
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
redo entries                                                              2
redo size                                                               720
CDB_PDB@CHF> insert into g_t_xifenfei select level, level from dual connect by level <= 10000;
已创建 10000 行。
CDB_PDB@CHF> select name, value from v$mystat natural join v$statname
  2    where name = 'redo size' or name = 'redo entries';
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
redo entries                                                              3
redo size                                                              1000

这里可以看到redo的量之时增加了280byte,redo entries增加了1,增加量非常小,完全和temp_undo_enabled=false不是一个等量级

补充说明
在临时表使用比较多的系统中,设置temp_undo_enabled=true可以减少不少的redo产生,正是因为这样的机制产生,可以实现ORACLE 12C ADG中可以实现全局临时表的DML操作