临时表 DML 产生redo 问题说明

关于Oracle临时表,参考我的Blog:

Oracle临时表

http://blog.csdn.net/xujinyang/article/details/6830254

对Oracle临时表的操作,会产生redo和undo。

先看一个示例:

SYS@anqing1(rac1)> CREATE GLOBAL TEMPORARY TABLE dave_test(id number,name varchar2(20)) ON COMMIT DELETE ROWS;

Table created.

SYS@anqing1(rac1)> set autotrace on

SYS@anqing1(rac1)> insert into dave_test values(1,'dave');

1 row created.

Execution Plan

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

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

| Id| Operation| Name | Rows| Bytes | Cost (%CPU)| Time|

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

|0 | INSERT STATEMENT ||1 |100 |1(0)| 00:00:01 |

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

Statistics

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

2recursive calls

8db block gets

1consistent gets

0physical reads

284redo size

662bytes sent via SQL*Net to client

571bytes received via SQL*Net from client

3SQL*Net roundtrips to/from client

1sorts (memory)

0sorts (disk)

1rows processed

SYS@anqing1(rac1)>

关于这些统计数据的分析,参考我的Blog:

Oracle Explain Plan

http://blog.csdn.net/xujinyang/article/details/6832655

在看下为什么对临时表操作会产生redo。

因为我们可以对临时表的操作进行回滚,即会产生undo数据;但是所有undo都受到redo的保护,就是说假设此时数据库崩溃了,下次启动会利用redo把这些undo再次还原出来,然后利用这些undo进行反操作,撤销上次那个崩溃的事务。

这些undo里面可能有普通表的,也有临时表的,redo都会把它们恢复出来。

这个就是我们的一个数据库roll forward和roll back的顺序问题,在Crash recover的时候必须先前滚,用redo恢复出undo之后,在用undo回滚相关事务操作信息。简单点说REDO的作用就是记录所有的数据库更改,包括UNDO表空间在内。

Oracle实例恢复时前滚(roll forward)后滚(roll back)问题

http://blog.csdn.net/xujinyang/article/details/6831268


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值