临时表不会为其中的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表空间处理详解 #### 一、Temp表空间处理 在Oracle数据库中,Temp表空间主要用于存储临时对象,如排序、分组等操作产生的临时数据。这些操作可能会导致Temp表空间迅速增大。然而,...
临时表比正常表产生的 REDO 少得多,然而,由于临时表必须产生包含数据的 UNDO 信息,所以会产生一定数量的 REDO 日志。 DB2 中的临时表 在 DB2 中,临时表可以使用 DECLARE GLOBAL TEMPORARY TABLE 语句来定义。...
1. **降低 Redo 日志占用空间**:Temporary Undo 使得临时表的Undo信息不再记录到Redo日志中,这有助于减小Redo日志的大小,进而提高LogMiner等组件的解析效率。 2. **减少 Undo 表空间的压力**:由于临时表的Undo...
1.4. 临时表与 Redo、Undo 临时表是 Oracle 中的一种特殊类型的表,它们的生命周期非常短暂。它们通常用于存储临时数据,例如查询结果或中间结果。临时表的特点是它们的数据不需要被持久化。 1.4.1. 临时表简述 ...
由于临时表的数据不记录在重做日志(redo logs)中,这有助于提高性能,因为减少了日志写入的操作。然而,为了事务一致性,undo logs(回滚日志)仍然会被记录,以支持事务的回滚操作。在会话异常终止如发生会话或...
会话级临时表的数据存活期与会话同步,即当用户结束会话时,Oracle会自动清理该会话在临时表中产生的所有数据。另一方面,事务级临时表的数据则仅在事务期间有效,一旦事务提交(commit)或回滚(rollback),临时表...
Temporary Undo是一种特殊设置,允许临时表空间用于Undo存储,通常在处理大量临时数据时使用。 DML操作中,UPDATE通常会产生最多的Undo,因为它需要记录原值和新值。 Oracle中与Undo相关的数据字典和视图包括DBA_...
临时表空间由临时数据文件组成,不存储永久性对象,因此无需备份,且其操作不记录redo日志,但会产生undo日志。 4. **UNDO表空间** UNDO表空间是Oracle特有的,它用于存储事务中DML语句的undo信息,即数据在被修改...
1.临时表的改进 2.持续的全局变量 3.取消默认MyISAM系统表 4.UNDO空间回收 5.UTF8性能改进 6.取消Query Cache 7.原子DDL 8.更快、性能更好的Schema和Information Schema 9.角色管理 10.加密表空间中的REDO...
6. **临时表空间**:InnoDB在执行查询时,会将结果暂时存储在临时表空间中。在5.7.6版后引入的`general tablespace`允许创建独立的ibd文件,包含多个表,并且可以在不同数据库之间共享。 7. **内存结构**:除了缓存...
- 临时表优化:独立表空间、不记录redo、更少的锁,提高了临时表的处理速度。 - UNDO日志的清除:可以通过设置innodb_undo_log_truncate来自动截断过长的undo日志。 - 多个page cleaner线程:提升了脏页刷新的效率。...
新的临时表可以使用独立的表空间,并且不再记录redo日志,没有change buffer和锁,这减少了系统资源的占用。而当undo日志超过innodb_max_undo_log_size时,可以通过innodb_undo_log_truncate选项自动进行清理。 另...
对于临时UNDO,12C采用了新的设计,临时表的UNDO信息不再记录在UNDO表空间中,而是写入临时表空间,从而减少了UNDO和REDO的生成量,进而降低I/O和存储的压力。管理员可以通过ALTER SYSTEM命令来启用临时UNDO,并通过...
这门课程的内部教材涵盖了Oracle数据库的体系架构、实例管理、数据库启动关闭、控制文件、redo日志、归档日志、日志挖掘、undo管理、检查点、实例恢复机制、存储架构、数据字典、表空间、表的类型、审计以及数据装载...
1. **创建新的临时表空间**:在新的存储位置上创建临时表空间,并设置为默认临时表空间。 ```sql SQL> create temporary tablespace temp1 tempfile '/dev/raw41' size 50m; SQL> alter database default ...
非系统表空间包括 UNDO 表空间、临时表空间和用户表空间等。 三、表空间管理方式 表空间管理方式有字典管理方式和本地管理方式两种。字典管理方式使用数据字典来管理存储空间的分配,而本地管理方式将区的分配和...
临时表空间通常用于临时存储和排序操作。迁移临时表空间的步骤如下: 1. 将临时表空间脱机: ```sql ALTER TABLESPACE temp OFFLINE; ``` 2. 移动数据文件: ```sql ALTER DATABASE RENAME FILE '/old/path/...
- **数据库实例与表空间管理**:理解数据库实例的启动与关闭过程,熟悉不同类型的表空间(如系统表空间、用户表空间、临时表空间)及其管理策略。 - **数据文件与控制文件**:掌握数据文件与控制文件的作用及管理...
- 解决方案:增加临时表空间大小或创建新的临时表空间;检查是否临时表空间中有未释放的空间资源,并适当调整资源管理策略。 2. **ORA-01653: 无法扩展表空间中的段** - 原因:当表空间中的某个段需要扩展但找不...