Oracle 临时表

一、临时表的介绍:

Oracle的临时表只存在于某个会话或者事物的生命周期里,此时临时表中的数据只对当前这个会话可见。

临时表经常被用于存放一个操作的中间数据(数据处理的中间环节)。

临时表由于不产生redo,能够提高数据操作的性能。

二、临时表的创建:

创建Oracle临时表,可以用两种类型的临时表:

a、会话级的临时表

b、事务级的临时表

2.1、会话级的临时表因为这个临时表中的数据和你的当前会话有关系,当你当前SESSION不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION登陆的时候是看不到另外一个SESSION中插入到临时表中的数据的。即两个不同的SESSION所插入的数据是互不相干的。当某一个SESSION退出之后临时表中的数据就被截断(truncate table,即数据清空)了。会话级的临时表的创建方法:

 ----创建会话级临时表jack_tmp_session----
1 SQL> create global temporary table jack_tmp_session on commit preserve rows as select * from dba_objects where 1=2; 表已创建。 SQL> select table_name,temporary,duration,tablespace_name from user_tables where table_name='JACK_TMP_SESSION'; TABLE_NAME T DURATION TABLESPACE_NAME
------------------------------ - ------------------------------ ------------------------------
JACK_TMP_SESSION Y SYS$SESSION SQL> select count(*) from JACK_TMP_SESSION; COUNT(*)
----------
0 SQL> select sid from v$mystat where rownum=1; SID
----------
38 ----往表里面插入一下数据,并且执行commit,发现数据没有丢失----
SQL> insert into JACK_TMP_SESSION select * from dba_objects; 已创建72511行。 SQL> select count(*) from JACK_TMP_SESSION; COUNT(*)
----------
72511 SQL> commit; 提交完成。 SQL> select count(*) from JACK_TMP_SESSION; COUNT(*)
----------
72511 ----从另外一个SESSION中查询JACK_TMP_SESSION表,发现没有数据,说明两个不同的SESSION所插入的数据是互不相干的----
SQL> select sid from v$mystat where rownum=1; SID
----------
26 SQL> select count(*) from JACK_TMP_SESSION; COUNT(*)
----------
0 ----从SESSION38中退出SQLPLUS,再进去,发现数据没有了----
SQL> exit;
从 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 断开
[oracle@rhel5 ~]$ ./rlwrap SQL*Plus: Release 11.2.0.1.0 Production on 星期三 11月 13 14:59:28 2013 Copyright (c) 1982, 2009, Oracle. All rights reserved. SQL> conn echo/echo
已连接。
SQL> select count(*) from JACK_TMP_SESSION; COUNT(*)
----------
0

2.2、事务级临时表是指该临时表
    事务级临时表是指临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表一致(包括退出SESSION的时候,事务级临时表也会被自动截断)。事务级临时表的创建方法:

 SQL> create global temporary table jack_tmp_transaction on commit delete rows as select * from dba_objects where 1=2;

 表已创建。

 SQL> set linesize 200;
SQL> select table_name, temporary, DURATION from user_tables where table_name='JACK_TMP_TRANSACTION'; TABLE_NAME T DURATION
------------------------------ - ------------------------------
JACK_TMP_TRANSACTION Y SYS$TRANSACTION SQL> select count(*) from JACK_TMP_TRANSACTION; COUNT(*)
----------
0 SQL> insert into JACK_TMP_TRANSACTION select * from dba_objects; 已创建72512行。 SQL> select count(*) from JACK_TMP_TRANSACTION; COUNT(*)
----------
72512 SQL> commit; 提交完成。 SQL> select count(*) from JACK_TMP_TRANSACTION; COUNT(*)
----------
0

2.3、两种类型临时表的区别
    会话级临时表采用on commit preserve rows;而事务级则采用on commit delete rows;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是commit、rollback或者是会话结束,临时表中的数据都将被截断。

2.4、什么时候使用临时表

1)、当某一个SQL语句关联的表在2张以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中;

2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。

上一篇:process 多进程写法 multiprocessing


下一篇:Oracle临时表GLOBAL TEMPORARY TABLE