`

临时表与redo、undo

阅读更多

临时表不会为其中的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》

分享到:
评论

相关推荐

    Oracle的Temp表空间和UNDO表空间的处理

    ### Oracle的Temp表空间与UNDO表空间处理详解 #### 一、Temp表空间处理 在Oracle数据库中,Temp表空间主要用于存储临时对象,如排序、分组等操作产生的临时数据。这些操作可能会导致Temp表空间迅速增大。然而,...

    主流数据库中临时表的使用

    临时表比正常表产生的 REDO 少得多,然而,由于临时表必须产生包含数据的 UNDO 信息,所以会产生一定数量的 REDO 日志。 DB2 中的临时表 在 DB2 中,临时表可以使用 DECLARE GLOBAL TEMPORARY TABLE 语句来定义。...

    12c 新特性-Temporary Undo

    1. **降低 Redo 日志占用空间**:Temporary Undo 使得临时表的Undo信息不再记录到Redo日志中,这有助于减小Redo日志的大小,进而提高LogMiner等组件的解析效率。 2. **减少 Undo 表空间的压力**:由于临时表的Undo...

    ORACLE的UNDO表空间

    1.4. 临时表与 Redo、Undo 临时表是 Oracle 中的一种特殊类型的表,它们的生命周期非常短暂。它们通常用于存储临时数据,例如查询结果或中间结果。临时表的特点是它们的数据不需要被持久化。 1.4.1. 临时表简述 ...

    oracle,sql临时表.pdf

    由于临时表的数据不记录在重做日志(redo logs)中,这有助于提高性能,因为减少了日志写入的操作。然而,为了事务一致性,undo logs(回滚日志)仍然会被记录,以支持事务的回滚操作。在会话异常终止如发生会话或...

    oracle,sql临时表.docx

    会话级临时表的数据存活期与会话同步,即当用户结束会话时,Oracle会自动清理该会话在临时表中产生的所有数据。另一方面,事务级临时表的数据则仅在事务期间有效,一旦事务提交(commit)或回滚(rollback),临时表...

    Oracle 面试宝典-undo.docx

    Temporary Undo是一种特殊设置,允许临时表空间用于Undo存储,通常在处理大量临时数据时使用。 DML操作中,UPDATE通常会产生最多的Undo,因为它需要记录原值和新值。 Oracle中与Undo相关的数据字典和视图包括DBA_...

    Oracle数据库自带表空间的详细说明

    临时表空间由临时数据文件组成,不存储永久性对象,因此无需备份,且其操作不记录redo日志,但会产生undo日志。 4. **UNDO表空间** UNDO表空间是Oracle特有的,它用于存储事务中DML语句的undo信息,即数据在被修改...

    mysql 8 windows

    1.临时表的改进 2.持续的全局变量 3.取消默认MyISAM系统表 4.UNDO空间回收 5.UTF8性能改进 6.取消Query Cache 7.原子DDL 8.更快、性能更好的Schema和Information Schema 9.角色管理 10.加密表空间中的REDO...

    Innodb的整体架构图1

    6. **临时表空间**:InnoDB在执行查询时,会将结果暂时存储在临时表空间中。在5.7.6版后引入的`general tablespace`允许创建独立的ibd文件,包含多个表,并且可以在不同数据库之间共享。 7. **内存结构**:除了缓存...

    藏经阁-PHP 2017.北京 全球开发者大会——高可用的PHP.pdf

    - 临时表优化:独立表空间、不记录redo、更少的锁,提高了临时表的处理速度。 - UNDO日志的清除:可以通过设置innodb_undo_log_truncate来自动截断过长的undo日志。 - 多个page cleaner线程:提升了脏页刷新的效率。...

    MySQL 5.7优化不求人

    新的临时表可以使用独立的表空间,并且不再记录redo日志,没有change buffer和锁,这减少了系统资源的占用。而当undo日志超过innodb_max_undo_log_size时,可以通过innodb_undo_log_truncate选项自动进行清理。 另...

    00 12C新特性介绍.pdf

    对于临时UNDO,12C采用了新的设计,临时表的UNDO信息不再记录在UNDO表空间中,而是写入临时表空间,从而减少了UNDO和REDO的生成量,进而降低I/O和存储的压力。管理员可以通过ALTER SYSTEM命令来启用临时UNDO,并通过...

    ocp11g培训内部教材_052课堂笔记(042)_体系架构

    这门课程的内部教材涵盖了Oracle数据库的体系架构、实例管理、数据库启动关闭、控制文件、redo日志、归档日志、日志挖掘、undo管理、检查点、实例恢复机制、存储架构、数据字典、表空间、表的类型、审计以及数据装载...

    oracle rac存储迁移

    1. **创建新的临时表空间**:在新的存储位置上创建临时表空间,并设置为默认临时表空间。 ```sql SQL&gt; create temporary tablespace temp1 tempfile '/dev/raw41' size 50m; SQL&gt; alter database default ...

    Oracle知识点.docx

    非系统表空间包括 UNDO 表空间、临时表空间和用户表空间等。 三、表空间管理方式 表空间管理方式有字典管理方式和本地管理方式两种。字典管理方式使用数据字典来管理存储空间的分配,而本地管理方式将区的分配和...

    Oracle数据库常见维护问题手册-精典

    临时表空间通常用于临时存储和排序操作。迁移临时表空间的步骤如下: 1. 将临时表空间脱机: ```sql ALTER TABLESPACE temp OFFLINE; ``` 2. 移动数据文件: ```sql ALTER DATABASE RENAME FILE '/old/path/...

    oracle database 11g Administration workshop-I

    - **数据库实例与表空间管理**:理解数据库实例的启动与关闭过程,熟悉不同类型的表空间(如系统表空间、用户表空间、临时表空间)及其管理策略。 - **数据文件与控制文件**:掌握数据文件与控制文件的作用及管理...

    ORACLE调优笔记

    - 解决方案:增加临时表空间大小或创建新的临时表空间;检查是否临时表空间中有未释放的空间资源,并适当调整资源管理策略。 2. **ORA-01653: 无法扩展表空间中的段** - 原因:当表空间中的某个段需要扩展但找不...

Global site tag (gtag.js) - Google Analytics