Oracle的临时表

Oracle允许创建临时表来保存会话或事务中的数据,在会话或事务结束时,表中的数据行被删除。在处理复杂查询或事务时,由于在数据写入永久表之前需要暂时存储行信息,所以就产生了用来存储这些数据的临时表。临时表提高了包含复杂查询的事务的性能。对复杂查询的传统响应方式之一是使用一个视图使复杂查询更易于操作,但是,该视图在每次访问它时都需要执行,因而在许多情况下抵消了它的好处。临时表是一个优秀的解决方案,因为它是为用于特殊会话或事务的复杂的select语句而建立的,并且它在会话后自动清除数据。

临时表的定义对于所有会话来说都是可见的,然而,临时表中的数据仅对执行插入这些数据的操作的会话是可见的。临时表通过"create global temporary table" 语句创建,on commit子句说明了临时表中的数据的保存时限,说明如下:
1、ON COMMIT DELETE ROWS -- 基于具体事务的临时表
当某事务第一次插入数据到该临时表时,会话将绑定该临时表,这种绑定一直持续到事务的结束。当事务提交会回滚后,oracle将截断该表。例如:

SQL> create global temporary table tmp1 (x number) on commit delete rows;
Table created.

SQL> insert into tmp1 values (123);
1 row created.

SQL> select * from tmp1;
         X
----------
       123

SQL> commit;
Commit complete.

SQL> select * from tmp1;
no rows selected

2、ON COMMIT PRESERVE ROWS  -- 基于特定会话的临时表
当某会话第一次插入数据到该临时表时,该会话将绑定该临时表,这种绑定一直持续到会话结束或该会话truncate该临时表。当会话终止时, oracle将截断该表。

临时表的其他特性如下:
A、临时表上可以创建索引,这些索引也是临时的。默认情况下,临时表中的行被存储在数据库的默认临时表空间内。也可以通过"create global temporary table ... tablespace"语句,为该临时表指定另外的临时表空间。
B、与永久表不同,临时表和其索引在创建时不会为其分配段,只有在第一次为该表插入数据(或者create table ... as select)时,才会执行段分配的操作。 //这一点在实验的过程中有一些疑问
C、一个基于特定事务的临时表在某一时刻只允许执行一个事务,如果事务中包含多个自治事务,那么只有在一个自治事务提交完成后,下一个自治事务才能够使用该临时表。
D、在备份和恢复过程中,临时表中的数据是不可用的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29515435/viewspace-1129799/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29515435/viewspace-1129799/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值