Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
Oracle临时表
 
    Oracle临时表只需要创建一次,其结构总是有效的,每次使用后被清空的只是表里的数据。
 
    Oracle的临时表还保证了 多用户操作的独立性:对于使用同一张临时表的不同用户,ORACLE都会分配一个独立的Temp Segment,这样就避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性;
    Oracle临时表分为两种,如下:
 

    create global temporary table t66 (

      ID number ,

      NAME varchar2 ( 20 ),

      OP_DATE date )

    on commit delete rows ;--数据提交时清空表

 

    create global temporary table t66 (

      ID number ,

      NAME varchar2 ( 20 ),

      OP_DATE date )

    on commit preserve rows ;--会话结束时清空表

 
 
临时表的存储空间
 

    select owner,table_name,tablespace_name from dba_tables where table_name= 'T66';

 
    由上面的查询发现,创建的临时表T66不在默认的表空间中储存
 
    SQL> alter tablespace temp offline;     
 
    表空间已更改。
 
    SQL> insert into t66
       2 select * from t1;
 
    insert into t66
                *
 
    ERROR 位于第 1 行:
    ORA-01542: 表空间'TEMP'脱机,无法在其中分配空间
 
    由上面的操作发现,表T66存储于TEMP表空间中
 
 
临时表应用举例
 
    1、临时表不建立索引,所以如果数据量比较大或进行多次查询时,不推荐使用
 
    2、数据处理比较复杂的时候使用临时表快,反之视图快点
 
    3、在仅仅查询数据的时候建议用游标
 
    4、在分析数据时,经常用到临时表来存放中间数据
 
    举例: 对于一个电子商务类网站,不同消费者在网站上购物,就是一个独立的SESSION,选购商品放进购物车中,最后将购物车中的商品进行结算。也就是说,必须在整个SESSION期间保存购物车中的信息。同时,还存在有些消费者,往往最终结账时放弃购买商品。如果,直接将消费者选购信息存放在最终表(PERMANENT)中,必然对最终表造成非常大的压力。
    因此,对于这种案例就可以采用创建临时表 (ON COMMIT PRESERVE ROWS) 的方法来解决。数据只在 SESSION 期间有效,对于结算成功的有效数据,转移到最终表中后,ORACLE自动TRUNCATE 临时数据;对于放弃结算的数据,ORACLE 同样自动进行 TRUNCATE ,而无须编码控制,并且最终表只处理有效订单,减轻了频繁的DML的压力。
 
 
临时表使用索引问题
 
    总体来说,在临时表上建立索引经常会被忽略不使用,所以尽量还是不要加索引,太大的数据量就不要用临时表了。
 
    具体的索引使用情况参见文章 http://bbs.bitscn.com/69514
 
 
 
posted on 2008-10-15 20:01 decode360 阅读(133) 评论(0)  编辑  收藏 所属分类: 07.Oracle

只有注册用户登录后才能发表评论。


网站导航: