如上所示,临时表是存储在临时表空间里面的,但是上面脚本可以看出,临时表在数据字典中没有指定其表空间,临时表是NOLOGGING,DURATION为SYS$SESSION
临时表的DML操作速度比较快,但同样也是要产生 Redo Log ,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少其实在应用中,往往会创建一个NOLOGGING的永久表(中间表)来保存中间数据,从而代替临时表,至于这这两者有啥优劣,真是很难说清道明(欢迎大家探讨)。
临时表用途
什么时候使用临时表?用临时表和用中间表有啥区别呢?
我觉得是在需要的时候应用,下面是David Dai关于临时表的一个应用说明,我觉得非常形象的说明了临时表的应用场景:对于一个电子商务类网站,不同消费者在网站上购物,就是一个独立的 SESSION,选购商品放进购物车中,最后将购物车中的商品进行结算。也就是说,必须在整个SESSION期间保存购物车中的信息。同时,还存在有些消费者,往往最终结账时放弃购买商品。如果,直接将消费者选购信息存放在最终表(PERMANENT)中,必然对最终表造成非常大的压力。因此,对于这种案例,就可以采用创建临时表(ON COMMIT PRESERVE ROWS)的方法来解决。数据只在 SESSION 期间有效,对于结算成功的有效数据,转移到最终表中后,ORACLE自动TRUNCATE 临时数据;对于放弃结算的数据,ORACLE 同样自动进行 TRUNCATE ,而无须编码控制,并且最终表只处理有效订单,减轻了频繁的DML操作的压力。
1:当处理某一批临时数据,需要多次DML操作时(插入、更新等),建议使用临时表。
2:当某些表在查询里面,需要多次用来做连接时。(为了获取目标数据需要关联A、B、C, 同时为了获取另外一个目标数据,需要关联D、B、C....)
关于临时表和中间表(NOLOGGING,保存中间数据,使用完后删除)那个更适合用来存储中间数据,我个人更倾向于使用临时表,而不建议使用中间表。
注意事项
1 ) 不支持 lob 对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。这点网上很多资料都这么说,我没有追查到底是那个版本不支持lob对象,至少在ORACLE 10g这个版本中,临时表是支持lob对象的.
SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST
2 (
3 ID NUMBER ,
4 NAME CLOB
5 ) ON COMMIT PRESERVE ROWS;
Table created
SQL>
SQL> INSERT INTO TMP_TEST
2 SELECT 1, 'ADF' FROM DUAL;
1 row inserted
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
2 ) 不支持主外键关系
3 )临时表不能永久的保存数据。
4 )临时表的数据不会备份,恢复,对其的修改也不会有任何日志信息
5 )临时表不会有DML 锁
DML locks are not acquired on the data of the temporary tables. The LOCK statement has no effect on a temporary table, because each session has its own private data.
6 )尽管对临时表的DML操作速度比较快,但同样也是要产生 Redo Log ,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少。请见官方文档:
DML statements on temporary tables do not generate redo logs for the data changes.However, undo logs for the data and redo logs for the undo logs are generated. Data from the temporary table is automatically dropped in the case of session termination,either when the user logs off or when the session terminates abnormally such as during a session or instance failure.
7 ) 临时表可以创建临时的索引、视图、触发器。
8 ) 如果要DROP会话级别临时表,并且其中包含数据时,必须先截断其中的数据。否则会报错。
SQL> DROP TABLE TMP_TEST PURGE;
DROP TABLE TMP_TEST PURGE
ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
SQL> TRUNCATE TABLE TMP_TEST;
Table truncated
SQL> DROP TABLE TMP_TEST PURGE;
Table dropped