近年我做的项目中较少使用临时表Temporary Table ,其实 Temp Table 还是可以有比较广泛的应用的。 Temp Table 的特点: (1) 多用户操作的独立性:对于使用同一张临时表的不同用户,ORACLE都会分配一个独立的 Temp Segment,这样就避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性; Temp Table 数据的时效性: (1)On Commit Delete Rows: 数据在 Transaction 期间有效,一旦COMMIT后,数据就被自动 TRUNCATE 掉了; SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Trans 表已创建。 SQL> INSERT INTO QCUI_Temp_Trans 已创建4行。 SQL> SELECT * FROM QCUI_Temp_Trans; DEPTID DEPTNAME 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 表已创建。 SQL> Select * from QCUI_Temp_Sess; DEPTID DEPTNAME SQL> exit C:\Documents and Settings\QCUI>sqlplus sqltrainer@ibm SQL> SELECT * FROM QCUI_Temp_Sess; 未选定行 注:这里要说明的是,ORACLE Truncate 掉的数据仅仅是分配给不同 Session 或 Transaction的 Temp Segment 上的数据,而不是将整张表数据 TRUNCATE 掉。 Temp Table 的应用: Temp Table 就我理解而言,主要有两方面应用。 对于一个电子商务类网站,不同消费者在网站上购物,就是一个独立的 SESSION,选购商品放进购物车中,最后将购物车中的商品进行结算。也就是说,必须在整个SESSION期间保存购物车中的信息。同时,还存在有些消费者,往往最终结账时放弃购买商品。如果,直接将消费者选购信息存放在最终表(PERMANENT)中,必然对最终表造成非常大的压力。 Temp Table 存放在哪儿? Temp Table 并非存放在用户的表空间中,而是存放在 Schema 所指定的临时表空间中。 SQL> Select Table_Name, Tablespace_Name TABLE_NAME TABLESPACE_NAME 可见这两张临时表并未存放在用户的表空间中。 SQL> SELECT UserName, Default_Tablespace def_ts, Temporary_Tablespace temp_ts USERNAME DEF_TS TEMP_TS SQL> connect system/manager@ibm 已连接。 SQL> alter tablespace temp offline; 表空间已更改。 SQL> connect sqltrainer/sqltrainer@ibm 已连接。 SQL> INSERT INTO QCUI_Temp_Sess INSERT INTO QCUI_Temp_Sess ERROR 位于第 1 行: 对 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 表已创建。 SQL> INSERT INTO QCUI_Temp_Sess_AllObj 已创建21839行。 Statistics SQL> CREATE TABLE QCUI_ALL_OBJECTS 表已创建。 SQL> INSERT INTO QCUI_All_Objects 已创建21839行。 Statistics |