临时表与redo、undo

本文通过实验对比了Oracle数据库中对永久表和临时表执行INSERT、UPDATE、DELETE操作时redo和undo信息的生成情况。结果显示,对临时表的操作仅生成少量的redo信息,而更新永久表时产生的redo信息是更新临时表的两倍。同时,删除操作在两种表中均产生了大量的undo信息,但redo信息较少。

临时表不会为其中的blocks生成redo信息,所以对临时表的操作是不可恢复的。用户修改临时表的block时,在redo log file中不会有对该block的修改信息。但是临时表会生成undo信息。因此,实际上,对临时表的操作会因为undo的生成而产生redo信息。

 

为何会生成undo信息呢?这是为了在transaction中可以实现roll back到SAVEPOINT。例如:用户可能rollback临时表中最新插入的50条记录,而保留最先插入的50条记录。这就需要为插入的100条记录产生undo信息,切必须log,以备rollback。

 

下面就验证对临时表的操作只会生成少量的redo信息。为了验证这一观点,会创建一个permanent table和temporary table进行对比。

 

 

创建函数get_stat_val

    create or replace function get_stat_val(p_name in varchar2) return number

    as

           l_val number;

    begin

      select b.value into l_val from v$statname a,v$mystat b

       where a.statistic# = b.statistic# and a.name = p_name;

 

       return l_val;

    end;

 

创建过程do_sql:

    create or replace procedure do_sql( p_sql in varchar2) 

    as 

           l_start_redo number;

           l_redo number;

    begin

            l_start_redo :=get_stat_val('redo size');

            execute immediate p_sql;

            commit;

            l_redo :=get_stat_val('redo size') - l_start_redo;

            dbms_output.put_line(to_char(l_redo,'99,999,999') 

                        ||'bytes of redo generated for "'|| 

                                    substr(replace(p_sql,chr(10),' '),1,25) ||'"...');

    end;

    /

 

 

在永久表和临时表中分别执行INSERT、UPDATE、DELETE

    set serveroutput on format wrapped

 

    begin 

                do_sql('insert into perm select 1,1,1 from all_objects where rownum<=500');

                do_sql('insert into temp select 1,1,1 from all_objects where rownum<=500');

                dbms_output.new_line;

                do_sql('update perm set x=2');

                do_sql('update temp set x=2');

                dbms_output.new_line;

                do_sql('delete from perm');

                do_sql('delete from temp');

    end;

    /

 

输出:

  3,297,284bytes of redo generated for "insert into perm select 1"...

     68,492bytes of redo generated for "insert into temp select 1"...

 

  4,681,496bytes of redo generated for "update perm set x=2"...

  2,065,204bytes of redo generated for "update temp set x=2"...

 

  3,330,524bytes of redo generated for "delete from perm"...

  3,226,032bytes of redo generated for "delete from temp"...


从上面可以看出:

1,对一个永久表进行INSERT操作,会生成大量redo,而对临时表进行同样的操作则几乎不生成redo。

2,对永久表进行的UPDATE操作生成的redo信息是临时表生成的redo信息的2倍。

3,  对永久表进行的DELETE操作和对临时表的操作生成的redo信息基本一样。这说明,不管是permanent table还            是temporary table,DELETE会产生大量undo信息,而redo信息很少。

 

于是,得出DML语句对临时表操作的以下结论:

1,INSERT只会生成少量的undo/redo信息

2,UPDATE永久表产生的undo/redo信息是UPDATE临时表的2倍。

3,DELETE永久表产生的undo/redo信息和DELETE临时表的基本一样。

 

以上参考自TOM的《Expert Oracle Database Architecture Oracle Database Programming 9i, 10g, and 11g Techniques and Solutions, Second Edition》

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值