Oracle学习笔记(二)——临时表
在针对大数据量的多表级联查询或复杂事务处理的时候,引入Oracle临时表是一种不错的策略。因此,在解决实际需求时经常会遇到需要使用存储过程和临时表相互配合的情况。下面就Oracle如何创建临时表以及注意事项做出总结:
一、创建临时表
Oracle临时表分为回话期和事务期两种类型,他们的创建语法基本一致:
- 会话期临时表
CREATE GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS;
- 事务期临时表
CREATE GLOBAL TEMPORARY TABLE ON COMMIT DELETE ROWS;
二、会话期临时表与事务期临时表的区别
在与事务相关的临时表中,数据只存在于事务期间。而在与会话相关的临时表中,数据只存在于会话期间。临时表中的数据为一个会话所私有。每个会话只能查询与修改属于此会话的数据。对临时表数据进行 DML 操作时无需加锁(Lock)。LOCK 语句对临时表无效,因为每个会话只能操作其私有数据。
针对与会话相关的临时表(session-specific temporary table)执行的 TRUNCATE 语句只会清除(truncate)属于此会话的数据,而不会清除此临时表中属于其他会话的数据。
用户可以使用 CREATE INDEX 语句为临时表(temporary 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 将解除会话与此临时表的绑定。
三、我们在什么时候应该选择临时表
临时表最常见的使用场合是在存储过程中。例如保存一些复杂检索的结果以提供给之后使用,从而可以避免反复查询。另一种可能的使用场合是在进行某些大数量的多表查询时,一些查询的结果集数据量较少。我们可以先将这部分数据保存在临时表中,从而降低多表查询的级联数量提高检索速度。这时更适合选择会话级临时表。
临时表本身并不难使用,但是我们时常会在生产中忘记它的存在。就我个人经验来说,在某些特定的需求中,使用临时表确实能够降低查询的复杂度和提高查询速度。