`
orange5458
  • 浏览: 347331 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ORACLE 临时表

阅读更多

1.简介

       临时表(Temporary table)用于保存事务或会话期间的中间结果集。

       临时表中保存的数据只对当前会话可见,所有会话都看不到其他会话的数据;即使当前会话已经提交(COMMIT)了数据,别的会话也看不到它的数据。

       对于临时表,不存在多用户并发问题,因为一个会话不会因为使用一个临时表而阻塞另一个会话。即使我们 “锁住”了临时表,也不会妨碍其他会话使用它们自己的临时表。

2.表空间

       临时表会从当前登录用户的临时表空间分配存储空间,或者如果从一个定义者权限(definer right)过程访问临时表,就会使用该过程所有者的临时表空间。全局临时表实际上是表本身的一个模板。创建临时表的动作不涉及存储空间分配;不会为此分配初始(INITIAL)区段,这与常规表有所不同。对于临时表,运行时当一个会话第一次在临时表中放入数据时,才会为该会话创建一个临时段。由于每个会话会得到其自己的临时段(而不是一个现有段的一个区段),每个用户可能在不同的表空间为其临时表分配空间。USER1的临时表空间可能设置为TEMP1,因此他的临时表会从这个表空间分配。USER2可能把TEMP2作为其临时表空间,他的临时表就会从那里分配。

3.与其他数据库临时表的区别

       Oracle的 临时表与其他关系数据库中的临时表类似,区别只是:Oracle的临时表是“静态”定义的。每个数据库只创建一次临时表,而不是为数据库中的每个存储过程都创建一次。在Oracle中,临时表一定存在,它们作为对象放在数据字典中,但是在会话向临时表中放入数据之前,临时表看上去总是空。由于临时表是 静态定义的,所以你能创建引用临时表的视图,还可以创建存储过程使用静态SQL来引用临时表,等等。

临时表可以有永久表的许多属性。它们可以有触发器、检查约束、索引等。但永久表的某些特性在临时表中并不支持,这包括:

  • 不能有引用完整性约束。临时表不能作为外键的目标,也不能在临时表中定义外键。
  • 不能有NESTED TABLE类型的列。在Oracle 9i及以前版本中,VARRAY类型的列也不允许;不过Oracle 10g中去掉了这个限制。
  • 不能是IOT。
  • 不能在任何类型的聚簇中。
  • 不能分区。
  • 不能通过ANALYZE表命令生成统计信息。

4.创建

 

CREATE GLOBAL TEMPORARY TABLE table

(column datatype [DEFAULT expr] [{ NULL | NOT NULL}]

[,column datatype [DEFAULT expr] [{ NULL | NOT NULL}] ...)

ON COMMIT {DELETE | PRESERVE} ROWS;

1)ON COMMIT {DELETE | PRESERVE} ROWS

ON COMMIT DELETE ROWS:基于事务的临时表

提交之后数据就消失。

ON COMMIT PRESERVE ROWS:基于会话的临时表

临时表中的数据可以跨提交存在,即提交之前仍然存在,但是断开连接后再连接后再连接时数据就没有了。

5.使用注意

       如果应用中需要临时存储一个行集由其他表处理(可能对应一个会话,也可能对应一个事务),临时表就很有用。不要把临时表作为一个分解大查询的方法,即拿到一 个大查询,把它“分解”为几个较小的结果集,然后再把这些结果集合并在一起(这看来是其他数据库中最常见的临时表用法)。实际上,你会发现,在几乎所有的 情况下。Oracle中如果将一个查询分解为较小的临时表查询,与原来的一个查询相比,只会执行得更慢。我就经常看到人们这样做,如果有可能把对临时表的 一系列INSERT重写为一个大查询(SELECT),所得到的单个查询会比原来的多步过程快得多。

6.参考资料

《Oracle 9i&10g编程艺术:深入数据库体系结构》10.9临时表

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics