zoukankan      html  css  js  c++  java
  • Oracle 临时表

    1.临时表的基础知识
    临时表只在Oracle 8i 以及以上产品中支持。ORACLE数据库除了可以保存永久表外,还可以建立临时 表temporary tables。这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据。当会话退出或者用户提交 commit和回滚rollback事务的时候,临时表的数据自动清空,但是临时表的结构以及元数据还存储在用户的数据字典中。
    Oracle的临时表创建之后基本不占用表空间,临时表并非存放在用户的表空间中,而是存放在 Schema 所指定的临时表空间中。如果你没有指定临时表(包括临时表的索引)存放的表空的时候,你插入到临时表的数据是存放在ORACLE系统的临时表空间中(TEMP)。
    可以对临时表创建索引,视图,触发器,可以用export和import工具导入导出表的定义,但是不能导出数据。表的定义对所有的会话可见。建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效.  
    尽管对临时表的DML操作速度比较快,但同样也是要产生 Redo Log ,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少。
    临时表的不足之处:
    1.不支持lob对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。
    2.不支持主外键关系
      特性和性能(与普通表和视图的比较) 
     1.临时表只在当前连接内有效 
     2.临时表不建立索引,所以如果数据量比较大或进行多次查询时,不推荐使用 
     3.数据处理比较复杂的时候时表快,反之视图快点 
      4.在仅仅查询数据的时候建议用游标: open cursor for 'sql clause'; 
    临时表的应用:
    对于一个电子商务类网站,不同消费者在网站上购物,就是一个独立的 SESSION,选购商品放进购物车中,最 后将购物车中的商品进行结算。也就是说,必须在整个SESSION期间保存购物车中的信息。同时,还存在有些消费者,往往最终结账时放弃购买商品。如果, 直接将消费者选购信息存放在最终表(PERMANENT)中,必然对最终表造成非常大的压力。因此,对于这种案例,就可以采用创建临时表 (ON COMMIT PRESERVE ROWS)的方法来解决。数据只在 SESSION 期间有效,对于结算成功的有效数据,转移到最终表中 后,ORACLE自动TRUNCATE 临时数据;对于放弃结算的数据,ORACLE 同样自动进行 TRUNCATE ,而无须编码控制,并且最终表只 处理有效订单,减轻了频繁的DML的压力。
    Temp Table 的另一个应用,就是存放数据分析的中间数据。
    2. 创建临时表
    Oracle临时表,有两种类型:
    会话级的临时表
    事务级的临时表。
    2.1. 会话级的临时表
    因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION不退出的情况下,临时表中的数据就还存 在,而当你退出当前SESSION的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION登陆的时候是看不到另外一个 SESSION中插入到临时表中的数据的。即两个不同的SESSION所插入的数据是互不相干的。当某一个SESSION退出之后临时表中的数据就被截断 (truncate table,即数据清空)了。注:这里要说明的是,ORACLE Truncate 掉的数据仅仅是分配给不 同 Session 或 Transaction的 Temp Segment 上的数据,而不是将整张表数据 TRUNCATE 掉。当Commit的 时候则数据还在,当Rollback的时候则数据也是一样被回滚. 会话级的临时表创建方法:
        CREATE GLOBAL TEMPORARY TABLE TABLE_NAME (<column specification>) 
    ON COMMIT PRESERVE ROWS;
    或者
       CREATE GLOBAL TEMPORARY TABLE TABLE_NAME ON COMMIT PRESERVE ROWS AS SELECT * FROM TABLE_NAME; 
     
    示例:
    SQL> CREATE GLOBAL TEMPORARY TABLE TT(ID NUMBER(2)) ON COMMIT PRESERVE ROWS ;
    表已创建。
    SQL> SELECT * FROM TT;
    未选定行
    SQL> INSERT INTO TT VALUES(1);
    已创建 1 行。
    SQL> COMMIT;
    提交完成。
    SQL> SELECT * FROM TT;
            ID
    ----------
             1
    SQL> INSERT INTO TT VALUES(2);
    已创建 1 行。
    SQL> SELECT * FROM TT;
            ID
    ----------
             1
             2
    SQL> ROLLBACK;
    回退已完成。
    SQL> SELECT * FROM TT;
            ID
    ----------
             1
    2.2 事务特有的临时表(默认类型) 
    该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临 时表的一致(包括退出SESSION的时候,事务级的临时表也会被自动截断)。一旦COMMIT后,数据就被自动 TRUNCATE 掉了. 事务级临时 表的创建方法:
        CREATE GLOBAL TEMPORARY TABLE TABLE_NAME (<column specification>) 
    ON COMMIT DELETE ROWS;
    或者
     CREATE GLOBAL TEMPORARY TABLE TABLE_NAME ON COMMIT DELETE ROWS AS SELECT * FROM TABLE_NAME; 
     
    CREATE GLOBAL TEMPORARY TABLE TABLE_NAME;  在不指明类型的情况下,默认为事务临时表。
    SQL> CREATE GLOBAL TEMPORARY TABLE TT2(ID NUMBER(2)) ON COMMIT DELETE ROWS ;
    表已创建。
    SQL> SELECT * FROM TT2;
    未选定行
    SQL> INSERT INTO TT2 VALUES(1);
    已创建 1 行。
    SQL> SELECT * FROM TT2;
         ID
    ----------
         1
    SQL> COMMIT;
    提交完成。
    SQL> SELECT * FROM TT2;
    未选定行
    SQL>
  • 相关阅读:
    【转载】一键安装maven脚本
    secureCRT的自动登录设置
    vi相关内容
    windows上的命令telnet
    【转载】bash: ifconfig: command not found 解决办法
    【转载】Linux中profile、bashrc、bash_profile之间的区别和联系
    virgo-tomcat没有任务错误日志的停掉的解决办法
    【转载】Linux kill, killall, kill -9
    #!bin/sh是啥
    Mysql 查找表中的多组前n大元素
  • 原文地址:https://www.cnblogs.com/datalife/p/1985303.html
Copyright © 2011-2022 走看看