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的压力。
临时表使用索引问题
总体来说,在临时表上建立索引经常会被忽略不使用,所以尽量还是不要加索引,太大的数据量就不要用临时表了。