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;