1. Oracle的临时表就是全局临时表,语法中必须加上GLOBAL,否则会报错,这点和sqlserver不一样,sqlserver存在什么临时表、全局临时表两种概念
2. 表的定义对所有的会话可见。数据只在产生transaction或session的当前会话中有效
3. 可以对临时表创建索引,视图,触发器
4. 可以用export和import工具导入导出表的定义,但是不能导出数据。
5. 建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效. 尽管对临时表的DML操作速度比较快,但同样也是要产生 Redo Log 。
LogMiner does not generate SQL redo for temporary tables. In such a case,
this column(V$LOGMNR_CONTENTS.SQL_REDO) will contain the string "/* No SQL_REDO for temporary tables */".
LogMiner does not generate SQL undo for temporary tables. In such a
case, this column(V$LOGMNR_CONTENTS.SQL_UNDO) will contain the string "/* No SQL_UNDO for temporary tables */".
6. 临时表不存在并发,就不存在锁,每个人看到的都是自己的东西 。临时表的数据只在一个transaction或session中有效,没有锁的概念
7. 一个用户的临时表就放在当前用户的临时表空间中,创建临时表后并不产生任何segments分配,与普通表不同,在dba_tables中看到临时表对应的tablespace_name为空。
8. 不管是事务级还是会话级,临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
例子:
SYSTEM.TEMP_TAB1是事务级的临时表
SYSTEM自己插入1条数据后不commit,SYSTEM自己SELECT该表,发现有1条数据,SYS用户可以SELECT到该表但是没有数据。
commit后,SYSTEM自己SELECT该表也没有数据了,SYS用户可以SELECT到该表但是没有数据
SYSTEM.TEMP_TAB2是会话级的临时表
SYSTEM自己插入1条数据后不commit,SYSTEM自己SELECT该表,发现有1条数据,SYS用户可以SELECT到该表但是没有数据。
commit后,SYSTEM自己SELECT该表,发现有1条数据,SYS用户可以SELECT到该表但是没有数据。使用SYSTEM用户重新开启一个会话SELECT该表发现没有数据了。退出可以SELECT到数据的当前SYSTEM用户再重新进去SELECT后发现改表没有数据了
SYSTEM.TEMP_TAB2是会话级的临时表
SYS用户插入1条数据后不commit,SYSTEM自己SELECT该表,发现没有数据,SYS用户可以SELECT到该表有1条数据。
事务级临时表的数据只在当前事务有效,通过语句:ON COMMIT DELETE ROWS 指定(默认方式,如下两行结果一致)。
CREATE GLOBAL TEMPORARY TABLE TEMP_TAB1(HID NUMBER,HNAME VARCHAR2(100))
CREATE GLOBAL TEMPORARY TABLE TEMP_TAB1(HID NUMBER,HNAME VARCHAR2(100)) ON COMMIT DELETE ROWS
会话级临时表的数据只在当前会话有效,通过语句:ON COMMIT PRESERVE ROWS指定。
CREATE GLOBAL TEMPORARY TABLE TEMP_TAB2(HID NUMBER,HNAME VARCHAR2(100)) ON COMMIT PRESERVE ROWS;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30126024/viewspace-1979083/ ,如需转载,请注明出处,否则将追究法律责任。