签到成功

知道了

CNDBA社区CNDBA社区

Oracle 12C 新特性之临时undo控制

2022-04-17 22:57 1039 0 原创 oracle
作者: hbhe0316

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

1.默认undo设置http://www.cndba.cn/hbhe0316/article/107931

http://www.cndba.cn/hbhe0316/article/107931

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

NAME                      VALUE
-------------------- ----------
redo entries                  0
redo size                     0

SQL> alter session set container = hbhe;

Session altered.

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

NAME                      VALUE
-------------------- ----------
redo entries                  0
redo size                     0

SQL> create global temporary table temp_hbhe 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                139
redo size                 46556

SQL> insert into temp_hbhe  select * from dba_objects;

73532 rows created.

SQL> commit;

Commit complete.

从上面的结果可以看到,在有dml操作(inert)时,产生了大量的redo。Redo日志的变化非常的明显。
SQL>  select name, value from v$mystat natural join v$statname where name in ('redo entries','redo size');

NAME                      VALUE
-------------------- ----------
redo entries               2781
redo size                637852

2.启用临时undo设置http://www.cndba.cn/hbhe0316/article/107931

http://www.cndba.cn/hbhe0316/article/107931
http://www.cndba.cn/hbhe0316/article/107931
http://www.cndba.cn/hbhe0316/article/107931

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                            0
redo size                               0

SQL> insert into temp_hbhe  select * from dba_objects;

73532 rows created.

SQL> commit;

Commit complete.

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                             652

结论:
1、在oracle 12C中,提供了关于全局临时变redo生成控制的参数temp_undo_enabled,该参数默认为false,此时临时表会产生一定量的redo信息,而当将该参数修改为true时,将抑止redo信息的产生,从而大大节省redo的存储空间以及在一定的程度上降低了数据库性能的开销。

http://www.cndba.cn/hbhe0316/article/107931

版权声明:本文为博主原创文章,未经博主允许不得转载。

oracle

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
hbhe0316

hbhe0316

关注

1.只有承认无知,才能装下新的东西; 2.进步来自一点点滴滴的积累; 3.广博让你更优秀,而专业让你无法替代; 4.挫折和失败能够转换为一种财富。

  • 889
    原创
  • 1
    翻译
  • 13
    转载
  • 24
    评论
  • 访问:1146730次
  • 积分:1523
  • 等级:核心会员
  • 排名:第6名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ