在针对大数据量的多表级联查询或复琐事务处理的时候,引入Oracle临时表是一种不错的策略。所以,在解决实际需求时常常会遇到须要使用存储过程和临时表相互配合的状况。下面就Oracle如何建立临时表以及注意事项作出总结:session
1、建立临时表大数据
Oracle临时表分为回话期和事务期两种类型,他们的建立语法基本一致:spa
CREATE GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS;xml
CREATE GLOBAL TEMPORARY TABLE ON COMMIT DELETE ROWS;索引
2、会话期临时表与事务期临时表的区别事务
在与事务相关的临时表中,数据只存在于事务期间。而在与会话相关的临时表中,数据只存在于会话期间。临时表中的数据为一个会话所私有。每一个会话只能查询与修改属于此会话的数据。对临时表数据进行 DML 操做时无需加锁(Lock)。LOCK 语句对临时表无效,由于每一个会话只能操做其私有数据。ci
针对与会话相关的临时表(session-specific temporary table)执行的 TRUNCATE 语句只会清除(truncate)属于此会话的数据,而不会清除此临时表中属于其余会话的数据。io
用户可使用 CREATE INDEX 语句为临时表(temporary table)建立索引。建立在临时表上的索引也是临时的,索引数据的生存周期与临时表内数据的生存周期相同。table
*用户能够建立同时访问永久表(permanent table)与临时表(temporary table)的视图。用户还能够在临时表上建立触发器(trigger)。语法
临时表(temporary table)使用临时段(temporary segment)存储数据。与永久表(permanent table)不一样,Oracle 在建立临时表及临时索引时并不会为其分配段(segment),段是在第一次执行 INSERT(或CREATE TABLE AS SELECT)语句时进行分配。在发生首次 INSERT 以前执行的 SELECT,UPDATE,或 DELETE 语句操做的是一个空表。
当没有会话(session)与临时表(temporary table)绑定(bound)的时候,用户才可以对其执行 DDL 操做(ALTER TABLE,DROP TABLE,CREATE INDEX 等)。对临时表执行 INSERT 语句时,会话将和此临时表绑定。在会话结束时对临时表执行的 TRUNCATE 语句将解除(unbound)会话与此临时表的绑定。对于与事务相关的(transaction-specific)临时表,执行 COMMIT 或 ROLLBACK 将解除会话与此临时表的绑定。
3、咱们在何时应该选择临时表
临时表最多见的使用场合是在存储过程当中。例如保存一些复杂检索的结果以提供给以后使用,从而能够避免反复查询。另外一种可能的使用场合是在进行某些大数量的多表查询时,一些查询的结果集数据量较少。咱们能够先将这部分数据保存在临时表中,从而下降多表查询的级联数量提升检索速度。这时更适合选择会话级临时表。
临时表自己并不难使用,可是咱们时常会在生产中忘记它的存在。就我我的经验来讲,在某些特定的需求中,使用临时表确实可以下降查询的复杂度和提升查询速度。