oracle之临时表(temporary table)

1、临时表的定义:

	用来保存事物或会话期间的中间结果,只对当前事务或者会话是可见的,其他任
何会话都无法进行读取的临时创建的表。

2、临时表的特点

多用户操作的独立性:对于使用同一张临时表的不同用户,Oracle都会分配一个独立
的TEMP SEGMENT,这样就避免了多个用户在对同一张临时表操作时发生交叉,从而
保证了多个用户操作的并发性和独立性

3、临时表的分类

1)会话级临时表

会话级临时表:会话级的临时表因为表中的数据与当前的会话还有关系,当你的ses
sion不退出的情况下,临时表中的数据就还存在。当你的session退出后,临时表中
的数据就消失了,每次会话退出后,临时表中的数据就被删除(truncate table)。
当以另一个session同时登陆的时候,是看不到上一个未关闭的session所保存的数据。
创建会话级临时表:
Create Global Temporary Table Table_Name(Col1 Type1,Col2 Type2...) 
On Commit Preserve Rows; 
example:
create global temporary table student(
stu_id int(5)
,stu_name varchar(5)
,class_id int(5))
on commit preserve rows;
或者如果有需要建立的临时表的时候:
CREATE GLOBAL TEMPORARY TABLE CGTT_PRESERVE_LHR ON COMMIT PRESERVE 
ROWS AS SELECT * FROM SCOTT.EMP WHERE 1=2;

2)事务级临时表

事务级临时表:事务级的的临时表与事务有关,当事务提交或者事务回滚的时候,
临时表中的数据会被截断,其他的内容与会话级的临时表一致(当退出session时
其对应的临时表的内容也会被截断)。
创建事务级临时表:
Create Global Temporary Table Table_Name(Col1 Type1,Col2 Type2...) 
On Commit Delete Rows;
example:
create global temporary table student(
stu_id int(5)
,stu_name varchar(5)
,class_id int(5))
on commit delete rows;

4、两种临时表的区别

会话级临时表采用的是:
on commit preserve rows,
事务级临时表采用的是:
on commit delete rows;
会话级的临时表在session结束的时候会临时表中的数据才会截断;
事务级的临时表在碰到commit,rollback,或者是会话结束,临时表的数据都会被截
断。

5、临时表的使用场景

1)当一个sql关联的表在2个及以上,并且和一写小表关联,可以将大表进行拆分并
且得到较小的结果集放在临时表中
2)程序执行过程中可能存放的一写临时数据,这些数据在整个的会话过程中都需要
用等等。

6、临时表的统计信息处理

临时表是会话隔离的,收集临时表的统计信息是没有任何用处,还可能造成错误的执
行计划。临时表的统计信息要删除,并且锁定临时表的统计信息,或者关闭数据库的
自动收集统计信息任务,改成手动去收集。
begin
 dbms_stats.delete_table_stats('SCOTT', 'TMP_TRAN_DEPT');
end;
begin
 dbms_stats.lock_table_stats('SCOTT', 'TMP_TRAN_DEPT');
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值