`

(转)Oracle 临时表的应用

 
阅读更多

http://hi.baidu.com/edeed/item/ae7b3bb5e5b90b75254b099d

Oracle 临时表的应用

近年我做的项目中较少使用临时表Temporary Table ,其实 Temp Table 还是可以有比较广泛的应用的。

Temp Table 的特点:

(1) 多用户操作的独立性:对于使用同一张临时表的不同用户,ORACLE都会分配一个独立的 Temp Segment,这样就避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性;
(2) 数据的临时性:既然是临时表,顾名思义,存放在该表中的数据是临时性的。ORACLE根据你创建临时表时指定的参数(On Commit Delete Rows / On Commit Preserve Rows),自动将数据TRUNCATE掉。

Temp Table 数据的时效性:

(1)On Commit Delete Rows: 数据在 Transaction 期间有效,一旦COMMIT后,数据就被自动 TRUNCATE 掉了;

SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Trans
2 ON COMMIT DELETE ROWS
3 AS
4 SELECT * FROM t_Department;

表已创建。

SQL> INSERT INTO QCUI_Temp_Trans
2 SELECT * FROM t_Dept;

已创建4行。

SQL> SELECT * FROM QCUI_Temp_Trans;

    DEPTID DEPTNAME
---------- --------------------
       101 销售部
       201 财务部
       301 货运部
       401 采购部

SQL> commit;

提交完成。

SQL> SELECT * FROM QCUI_Temp_Trans;

未选定行

(2)On Commit Preserve Rows :数据在 Session 期间有效,一旦关闭了Session 或 Log Off 后,数据就被 ORACLE 自动 Truncate 掉。

SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Sess
2 ON COMMIT PRESERVE ROWS
3 AS
4 SELECT * FROM t_Department;

表已创建。

SQL> Select * from QCUI_Temp_Sess;

    DEPTID DEPTNAME
---------- --------------------
       101 销售部
       301 货运部
       401 采购部
       201 财务部

SQL> exit

C:\Documents and Settings\QCUI>sqlplus

SQL> SELECT * FROM QCUI_Temp_Sess;

未选定行

注:这里要说明的是,ORACLE Truncate 掉的数据仅仅是分配给不同 Session 或 Transaction的 Temp Segment 上的数据,而不是将整张表数据 TRUNCATE 掉。

Temp Table 的应用:

Temp Table 就我理解而言,主要有两方面应用。

对于一个电子商务类网站,不同消费者在网站上购物,就是一个独立的 SESSION,选购商品放进购物车中,最后将购物车中的商品进行结算。也就是说,必须在整个SESSION期间保存购物车中的信息。同时,还存在有些消费者,往往最终结账时放弃购买商品。如果,直接将消费者选购信息存放在最终表(PERMANENT)中,必然对最终表造成非常大的压力。
因此,对于这种案例,就可以采用创建临时表( ON COMMIT PRESERVE ROWS )的方法来解决。数据只在 SESSION 期间有效,对于结算成功的有效数据,转移到最终表中后,ORACLE自动TRUNCATE 临时数据;对于放弃结算的数据,ORACLE 同样自动进行 TRUNCATE ,而无须编码控制,并且最终表只处理有效订单,减轻了频繁的DML的压力。
Temp Table 的另一个应用,就是存放数据分析的中间数据。

Temp Table 存放在哪儿?

Temp Table 并非存放在用户的表空间中,而是存放在 Schema 所指定的临时表空间中。

SQL> Select Table_Name, Tablespace_Name
2 From User_Tables
3 Where Table_Name Like 'QCUI%';

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
QCUI_TEMP_SESS
QCUI_TEMP_TRANS

可见这两张临时表并未存放在用户的表空间中。
用户 SQLTRAINER 的临时表空间是 TEMP , 用户创建的临时表是存放在TEMP表空间中的。下面来证明

SQL> SELECT UserName, Default_Tablespace def_ts, Temporary_Tablespace temp_ts
   2 FROM User_Users;

USERNAME                       DEF_TS             TEMP_TS
----------------------------- ------------------ ----------
SQLTRAINER                     ts_ORASQLTraining   TEMP

SQL> connect

已连接。

SQL> alter tablespace temp offline;      

表空间已更改。

SQL> connect

已连接。

SQL> INSERT INTO QCUI_Temp_Sess
2 SELECT * FROM t_Department;

INSERT INTO QCUI_Temp_Sess
            *

ERROR 位于第 1 行:
ORA-01542: 表空间'TEMP'脱机,无法在其中分配空间

对 Temp Table 的 DML 操作是否不产生 Redo Log ?

尽管对临时表的DML操作速度比较快,但同样也是要产生 Redo Log 的,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少。

SQL> Set AutoTrace On

SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Sess_AllObj
2 ON COMMIT PRESERVE ROWS
3 AS
4 SELECT * FROM All_Objects;

表已创建。

SQL> INSERT INTO QCUI_Temp_Sess_AllObj
2 SELECT * FROM All_Objects;

已创建21839行。

Statistics
---------------------------------------------------------
     ……
     168772 redo size
     ……

SQL> CREATE TABLE QCUI_ALL_OBJECTS
2 AS
3 SELECT * FROM All_Objects
4 WHERE 1 = 0;

表已创建。

SQL> INSERT INTO QCUI_All_Objects
2 SELECT * FROM ALL_Objects;

已创建21839行。

Statistics
----------------------------------------------------------
    ……
    2439044 redo size

分享到:
评论

相关推荐

    Oracle 临时表之临时表的应用问题

     临时表本质上是一种cache的表现形式,Oracle的临时表都是事先建好的,一旦用了临时表,存放的是和本会话相关的数据,没有人会傻乎乎地用临时表来保存本应该共享的数据。  with子查询实际上也是用了临时表,...

    Oracle 临时表用法汇总

    临时表的应用 1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。 2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个...

    Oracle中临时表的创建

    目前所有使用Oracle作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。  当然在Oracle中创建分区是一种不错的选择

    自定义临时表实现及在Oracle Spatial应用

    本文介绍了Oracle临时表功能以及Oracle临时表的不足之处,因此,洒家设计了一份自定义的临时表处理办法,使之可以支持Oracle Spatial数据类型和主外键关系,而且不会出现并发冲突。

    Oracle_临时表介绍

    目前所有使用Oracle作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。当然在Oracle中创建分区是一种不错的选择...那么这个时候我考虑在Oracle中创建“临时表”

    Oracle优化, 优化查询速度,目前所有使用Oracle作为数据库支撑平台的应用

    Oracle临时表 优化查询速度,目前所有使用Oracle作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。

    Oracle 10g应用指导

    主要包括各种类型的表创建以及适用情形,如外部表、分区表、嵌套表、全局临时表等;完整性约束的管理;索引,包括B树索引、基于函数的索引、位图索引、反向索引、降序索引、压缩索引等的使用方法及其适用情形等。在...

    从一个“普通”的Oracle DBA(Oracle数据库管理员)转变为Oracle Applications DBA(Oracle应用程序数据库管理员)

    从一个“普通”的Oracle DBA(Oracle数据库管理员)转变为Oracle Applications DBA(Oracle应用程序数据库管理员),有两个内容你必须去弄清楚。第一个内容是如何成为一个Oracle Applications DBA(Oracle应用程序...

    Oracle+10g应用指导与案例精讲

    主要包括各种类型的表创建以及适用情形,如外部表、分区表、嵌套表、全局临时表等;完整性约束的管理;索引,包括B树索引、基于函数的索引、位图索引、反向索引、降序索引、压缩索引等的使用方法及其适用情形等。在...

    21天学通Oracle

    5.6.5 临时表的应用场景 86 5.7 特殊的表dual 87 5.7.1 分析dual表 87 5.7.2 dual表的应用场景 87 5.7.3 修改dual表对查询结果的影响 88 5.8 本章实例 89 5.9 本章小结 90 5.10 习题 90 第6章 约束(教学...

    Oracle如何更改表空间的数据文件位置详解

    (Oracle数据库独特的高级应用) 表空间的分类 永久表空间:存储数据库中需要永久化存储的对象,比如二维表、视图、存储过程、索引。 临时表空间:存储数据库的中间执行过程,如:保存order by数据库排序,分组时...

    4.oracle_管理表空间

    oracle_管理表空间 一个数据库有: SYSTEM、SYSAUX、TEMP三个默认表空间 一个或多个临时表空间 一个撤销表空间 几个应用程序专用的应用表空间

    pgtt:PostgreSQL扩展,用于创建,管理和使用Oracle风格的全局临时表以及其他RDBMS

    PostgreSQL全局临时表 pgtt是PostgreSQL扩展,用于创建,管理和使用Oracle风格的Global Temporary Tables和其他RDBMS。 此扩展的目的是提出一个扩展,以提供等待核心实现的全局临时表功能。 此扩展的主要目的是在...

    oracle的sql优化

     *存在递归查询情况如果关联Table太多对性能会造成较大影响,往往推荐采用临时表转为分步骤操作提高性能  *尽量使用表关联查询而不使用函数,但涉及类似于代码表要重复关联多次取数据问题时候又适合使用函数

    Oracle.Database.11g.DBA手册.完整中文 (97M) part2/2

     规划和部署永久表空间、临时表空间和大文件表空间  优化磁盘分配、CPU利用率、I/O吞吐率和SQL查询  开发功能强大的数据库管理应用程序  使用Oracle Flashback和Oracle Automatic Undo Management阻止人为错误.....

    Oracle.Database.11g.DBA手册.完整中文 (97M) part1/2

     规划和部署永久表空间、临时表空间和大文件表空间  优化磁盘分配、CPU利用率、I/O吞吐率和SQL查询  开发功能强大的数据库管理应用程序  使用Oracle Flashback和Oracle Automatic Undo Management阻止人为错误.....

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    15.3.4临时表空间的调整 15.3.5日志文件的调整 15.3.6 UNDO表空间的调整 15.4应用系统 15.4.1应用拆分 15.4.2 SQL执行过程 15.4.3 SQL解析 15.4.4 SQL优化 15.4.5 SQL行源生成 15.4.6 SQL执行 15.5本章小...

    Oracle自学(学习)材料 (共18章 偏理论一点)

    11 管理表 目标 11-2 储存用户数据 11-3 Oracle 数据类型 11-5 ROWID 格式 11-8 行的结构 11-10 创建一张表 11-11 创建临时表 11-13 创建表:指南 11-14 修改储存参数 11-15 手工分配片 11-16 重构非分区表 11-17 ...

    Oracle数据库管理员技术指南

    7.8.7 恢复丢失的临时表空间 7.8.8 只读表空间丢失 7.8.9 索引表空间丢失 7.9 恢复联机重做日志 7.9.1 联机重做日志组某个成员丢失 7.9.2 非活动的重做日志组丢失 7.9.3 活动重做日志组丢失 7.10 恢复丢失的...

    ORACLE9i_优化设计与系统调整

    §9.4.4 临时表空间设计规划 100 §9.4.5 数据文件和日志文件在不同磁盘上 101 §9.5 数据库物理设计 101 §9.5.1 定量估计 101 §9.5.2 表空间与数据文件 102 §9.5.3 物理设计原则 103 §9.5.4 数据库物理设计内容...

Global site tag (gtag.js) - Google Analytics