关于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
-------------------------------------------------------------------------------------------------------