oracle临时表

来源:互联网 发布:更改路由器mac 编辑:程序博客网 时间:2024/06/03 15:06

  在Oracle中,临时表和普通数据表一样只需要一次创建,其结构从创建到删除的整个期间都是有效的。相对与
其他类型的表,临时表只有在实际向表中添加数据时,才会为期分配存储空间,并且分配的空间来自临时表空间
(temp),一次来避免与永久的数据争用存储空间。

   一.会话级临时表

  使用on commit preserve rows字句。会话级临时表在用户与服务器断开连接后被自动删除,临时表中存储的数据
只在会话进行期间有效。当前session不退出的情况下,临时表中的数据就还存在,当退出当前session的时候,临
时表中的数据就会被清空。并且另外一个session登录的时候是看不到之前session插入到临时表的数据的。即两个
不同的session所插入的数据是互不相干的
case:

 sys@ORCL> create temporary tablespace test_temp tempfile '/oracle/app/oracle/oradata/orcl/test_temp.dbf' size 20m ;

Tablespace created.


sys@ORCL> create global temporary table student (stu_id number(5),stu_name varchar2(8)) on commit preserve rows  tablespace test_temp;

Table created.


sys@ORCL> select table_name,temporary,tablespace_name from user_tables where table_name='STUDENT';

TABLE_NAME                     T TABLESPACE_NAME
------------------------------ - ------------------------------
STUDENT                        Y TEST_TEMP

   二.事物级临时表

  使用on commit delete rows字句。事物级临时表的记录会在每次提交事务后被自动删除,临时表中存储的数据只在当前事务处理期间有效。
另外和会话级临时表一样,退出session的时候,事物级的临时表也会被自动截断。

sys@ORCL> create global temporary table classes(class_id number(5),class_name varchar2(8)) on commit delete rows tablespace test_temp;

Table created.

   三.两种临时表的区别

  会话级别只有在会话结束时,临时表中的数据才会被截断,而事务级临时表不管是commit,rollback或者是会话结束,临时表中的数据都将会
被截断。

  else:不管是会话级还是事务级临时表,被截断(truncate)之后,临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成他的作

用后,最好手工删除,不然会残留很多临时表的表结构和元数据。

   四:注意事项 

  1.不支持lob对象
  2.不支持主外键关系
  3.临时表不能永久的保存数据
  4.临时表的数据不会备份,回复,对其的修改也不会有日志信息
  5.临时表不会有dml锁
DML lock 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.尽管对临时表的操作速度比较快,但同样也要产生redo log,只是同样的dml语句,比对permanet的dml 产生的redo log少。
  7.临时表可以创建临时的索引、视图和触发器
  8.如果要drop会话级别的临时表,并且包含数据时,必须先截断其中的数据。否则会报错。

sys@ORCL> drop table student;
drop table student
           *
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use
else:在临时表上创建索引时也需要先清空表数据,否则就会报错

  五.临时表的应用

case:
 对于一个电子商务网站,不同消费者在网站上购物,就是一个独立的session,选购商品放进购物车,最后将购物车中的商品进行结算。
也就是说,必须在曾哥session期间保存购物车中的信息。同时,有些消费者,往往最终结账时放弃购买商品。如果直接将消费者选购
的信息存放在最终表(permament)中,必然会对最终表造成非常大的压力。对于这种案例,就可以采用创建临时表(on commit preserve rows)
的方法来解决。数据只在session期间有效,对于结算成功的有效数据,转移到最终表中。oracle自动truncate临时表数据;对于放弃结算的
数据,oracle同样自动进行truncate,而无需再进行编码空值,并且最终表只处理有效订单,避免了频繁的dml操作。


总结起来,临时表有这样的特点:nologgin,保存中间数据,使用完删除

应用场景:

1.循环sql,

比如通常会有通过接口传入数千的参数,然后根据这些参数循环执行sql,优化时,可先把这些参数insert到临时表,然后关联该临时表
一次执行,以达到优化效果

2.多表关联

利用临时表简化有太多表关联的复杂sql

3.在某个数据集会多次使用的情况下使用临时表

4.复杂逻辑的大数据量更新时候,查询部分with就可以了

5.作为复杂查询条件的中间结果用于主查询
0 0