前言
目前所有使用Oracle作为数据库支撑平台的应用大部分数据量比较庞大的系统即表的数据量一般情况下都是在百万级以上的数据量当然在Oracle 中创建分区是一种不错的选择但是当你发现你的应用有多张表关联的时候并且这些表大部分都是比较庞大而你关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小并且查询得到这个结果集的速度非常快那么这个时候我考虑在Oracle中创建临时表
我对临时表的理解在Oracle中创建一张表这个表不用于其他的什么功能主要用于自己的软件系统一些特有功能才用的而当你用完之后表中的数据就没用了Oracle的临时表创建之后基本不占用表空间如果你没有指定临时表(包括临时表的索引)存放的表空的时候你插入到临时表的数据是存放在 ORACLE系统的临时表空间中(TEMP)
临时表的创建
创建Oracle临时表可以有两种类型的临时表会话级的临时表和事务级的临时表
)会话级的临时表因为这这个临时表中的数据和你的当前会话有关系当你当前SESSION不退出的情况下临时表中的数据就还存在而当你退出当前 SESSION的时候临时表中的数据就全部没有了当然这个时候你如果以另外一个SESSION登陆的时候是看不到另外一个SESSION中插入到临时表中的数据的即两个不同的SESSION所插入的数据是互不相干的当某一个SESSION退出之后临时表中的数据就被截断(truncate table即数据清空)了会话级的临时表创建方法Create Global Temporary Table Table_Name(Col TypeCol Type……) On Commit Preserve Rows举例create global temporary table Student(Stu_id Number()Class_id Number()Stu_Name Varchar()Stu_Memo varchar()) on Commit Preserve Rows
)事务级临时表是指该临时表与事务相关当进行事务提交或者事务回滚的时候临时表中的数据将自行被截断其他的内容和会话级的临时表的一致(包括退出 SESSION的时候事务级的临时表也会被自动截断)事务级临时表的创建方法Create Global Temporary Table Table_Name(Col TypeCol Type……) On Commit Delete Rows举例create global temporary table Classes(Class_id Number()Class_Name Varchar()Class_Memo varchar()) on Commit delete Rows
)两种不通类型的临时表的区别语法上会话级临时表采用on commit preserve rows而事务级则采用on commit delete rows用法上会话级别只有当会话结束临时表中的数据才会被截断而且事务级临时表则不管是commitrollback或者是会话结束临时表中的数据都将被截断
例子
)会话级(Session关闭掉之后数据就没有了当Commit的时候则数据还在当Rollback的时候则数据也是一样被回滚)
STU_ID CLASS_ID STU_NAME STU_MEMO 张三 福建 刘德华 福州 SHE 厦门 张惠妹 厦门
STU_ID CLASS_ID STU_NAME STU_MEMO 张三 福建 刘德华 福州 SHE 厦门 张惠妹 厦门
STU_ID CLASS_ID STU_NAME STU_MEMO 张三 福建 刘德华 福州 SHE 厦门 张惠妹 厦门 张惠妹 厦门
STU_ID CLASS_ID STU_NAME STU_MEMO 张三 福建 刘德华 福州 SHE 厦门 张惠妹 厦门 SQL>
)事务级(Commit之后就删除数据)本例子将采用以下的数据
insert into classes(Class_idClass_NameClass_Memo) values(计算机);insert into classes(Class_idClass_NameClass_Memo) values(经济信息); insert into classes(Class_idClass_NameClass_Memo) values(经济信息);
在一个SESSION中(比如SQLPLUS登陆)插入上面条记录然后再以另外一个SESSION(用SQLPLUS再登陆一次)登陆当你 select * from classes的时候classes表是空的而你再第一次登陆的SQLPLUS中select的时候可以查询到这个时候你没有进行commit或者rollback之前你可以对刚才插入的条记录进行updatedelete等操作当你进行commit或者rollback的时候这个时候由于你的表是事务级的临时表那么在插入数据的session也看不到数据了这个时候数据就已经被截断了
运行结果如下
CLASS_ID CLASS_NAME CLASS_MEMO 计算机 经济信息 经济信息SQL> delete from classes where class_id= ; row deletedSQL> select * from classes ;CLASS_ID CLASS_NAME CLASS_MEMO 计算机 经济信息 SQL> commit;Commit completeSQL> select *from classes ;CLASS_ID CLASS_NAME CLASS_MEMO SQL>再重复插入一次然后rollbackSQL> Rollback ;Rollback completeSQL> select * from classes ;CLASS_ID CLASS_NAME CLASS_MEMO SQL>
临时表的应用
)当某一个SQL语句关联的表在张及以上并且和一些小表关联可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中
)程序执行过程中可能需要存放一些临时的数据这些数据在整个程序的会话过程中都需要用的等等
注意事项
)临时表的索引以及对表的修改删除等和正常的表是一致的
)Oracle的临时表是Oraclei才支持的功能特性如果你的Oracle版本比较低的话那么就可能没有办法用到了如果你的Oracle 版本是i的话你还需要把$ORACLE_HOME/admin/${ORACLE_SID}/pfile目录下的init< ORACLE_SID>ora初始参数配置文件的compatible修改为compatible = 我的服务器上就是这样子配置的当然也可以修改为compatible =
以上是我在对大表进行优化的时候采用的一些手段效果显着